它不起作用的原因是因为您将它专门用于 pair,而不是从 pair 继承的类(顺便说一句,从 stdlib 类继承通常是个坏主意)。您可以将其专门用于D
.
template<class T>
struct A {
A(){cout << "not special\n";}
};
template<class T1, class T2>
struct A<pair<T1, T2>> {
A(){cout << "special\n";}
};
struct D : public pair<int, char>
{};
template<>
struct A<D> {
A(){cout << "special D\n";}
};
int main() {
A<D> a;
return 0;
}
输出special D
您也可以使用std::is_base_of
,但这会很痛苦,我建议不要使用。如果你对这样做的死心塌地,你可以有另一个像这样的课程
template <typename T, bool B>
struct helper;
template <typename T>
struct helper<T,true>;
template <typename T>
struct helper<T,true>;
然后您可以在第一个类中创建该类,例如
template<class T>
struct A {
helper<T,is_base_of<pair<int,char>,T>::value> h;
};
这应该让你开始我会让你弄清楚其余的:)。
这是一个更简洁的版本,只有一个类。
template<class T,bool B = is_base_of<pair<int,char>,T>::value>
struct A;
template<class T>
struct A<T,true> {
A(){cout << "special\n";}
};
struct D : public pair<int, char>
{};
template<class T>
struct A<T,false> {
A(){cout << "not special\n";}
};
int main() {
A<D> a;
A<int> b;
return 0;
}