2008-11-24 66 views
3

考虑以下使用的模板,模板参数...如何申报/定义模板与模板参数的一类,而无需使用额外的模板参数

#include <iostream> 

template <typename X> 
class A 
{ 
    X _t; 
public: 
    A(X t) 
     :_t(t) 
    { 
    } 
    X GetValue() 
    { 
     return _t; 
    } 
}; 

template <typename T, template <typename T> class C > 
class B 
{ 
    C<T> _c; 
public: 
    B(T t) 
     :_c(t) 
    { 
    } 
    T GetValue() 
    { 
     return _c.GetValue(); 
    } 
}; 

using namespace std; 

int main() 
{ 
    B<int, A> b(10); 
    cout<<b.GetValue(); 
    return 0; 
} 

有没有一种方法,通过该模板参数T可以去掉?例如,是否有办法做以下工作?

//Does not compile 
template <template <typename T> class C > 
class B 
{ 
    C _c; 
public: 
    B(T t) 
     :_c(t) 
    { 
    } 
    T GetValue() 
    { 
     return _c.GetValue(); 
    } 
}; 

int main() 
{ 
    B< A<int> > b(10); 
    cout<<b.GetValue(); 
    return 0; 
} 

回答

8

我假设你在代码中的X和A之后。

通常的模式是有

template<typename C> 
struct B 
{ 
    C c; 
}; 

,然后在类资格替代:

template<typename X> 
class A 
{ 
    typedef X type_name; 
    X t; 
}; 

然后你就可以访问使用C::type_name模板参数。

+0

感谢您的回答,尽管我最终自己发现了这个。我正在编辑问题并发布我的工作,但显然我来到正确的地方问这个问题! – 2008-11-24 14:05:07

+0

请注意,阳光的答案比我的好,因为他已经明白你想要什么。无需像我向你展示的那样重新绑定。只有在您使用A 时才需要此功能,但偶尔会有需要或A 。或者如果用户的视图是A ,但是您使用A 。 – 2008-11-24 14:14:33

1

什么是错的:

template <typename C > 
struct B 
{ 
    C c; 
}; 

int main() 
{ 
    B< A<int> > b; 
    return 0; 
} 
+0

我的不好,问题没有完全说明。现在它是。 – 2008-11-24 14:06:41

4

这是不可能的。请注意,这是一个常见的误解:A<int>不再是类模板!因此,这将不适合的模板,模板参数,但必须使用一个类型参数被接受:

template<typename C> 
struct B { 
    C c; 
}; 

B< A<int> > b; 

你使用一个单独的参数的方式是好的。

如果你想接受A<int>,但想重新将其绑定到另一个参数,你可以使用这个模式,还使用标准分配器:

template<typename T> 
struct A { 
    template<typename U> 
    struct rebind { 
     typedef A<U> type; 
    }; 
}; 

template<typename C> 
struct B { 
    typename C::template rebind<float>::type c; 
}; 

B< A<int> > b; 

现在,B< A<int> >::cA<float>类型。在C::之前的typename告诉编译器::type最后是一个类型而不是静态的非类型成员。 C::之后的template告诉编译器rebind<float>是一个模板实例化,而不是比较。

+0

好酷!很好的答案,但不幸的是,只能有一个答案,我认为@sunlight早些时候向你发布了他的解决方案。我已经提出了你的答案。 – 2008-11-24 14:14:28

1

您可以嵌套参数。也就是说,参数的值本身可以被参数化。

template <typename X> 
struct A 
{ 
    X t; 
}; 

template <typename C> 
struct B 
{ 
    C c; 
}; 

int main() 
{ 
    B< A<int> > b; 
    return 0; 
} 

在这个例子中,在bmain()声明创建的使用int作为参数A一个特例,然后它创建使用A<int>作为参数的B专业化。因此,B,C的专业化为A<int>

相关问题