我有五个课程,声明如下:
template <typename T>
class A {
void fn(X);
};
template <typename T>
class B {};
class C {};
class D {};
class X {};
我声明了两个实例:
A<B<C>> abc;
A<B<D>> abd;
如何对fn
进行模板化,以便必须使用abc.fn()
和C
类型的对象与abd.fn()
类型的对象调用D
?< / p>
答案 0 :(得分:3)
你可以像这样对你的班级进行部分专业化:
template <typename T> class A;
template <typename T> class B {};
template <typename T>
class A<B<T> > {
public:
void fn(T) { }
};
class C {};
class D {};
int main(int,char**)
{
A<B<C>> abc;
A<B<D>> abd;
abc.fn(C());
abd.fn(D());
return 0;
}
如果您希望它适用于任何模板,而不仅仅是B,您可以像这样部分地专门化A类:
template <typename T,template <typename> class U>
class A<U<T> > {
public:
void fn(T) { }
};
答案 1 :(得分:2)
这不会太漂亮。
template <typename T>
class B {public: typedef T type;};
template <typename T>
class A {
void fn(typename T::type X);
//void fn(...){} // would prevent an error if T does not have type.
};
基本上,您将类型保存在typedef中,然后在A
中使用它。如果B T
的{{1}}没有A
,那么这肯定会出错。