我有五个班级,声明如下:
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
您可以像这样对您的课程进行部分专业化:
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) { }
};
这不会太漂亮。
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 没有 of ,这当然会T
出错。A
T::type