それが機能しなかった理由は、ペアから継承するクラスではなく、ペアに特化したためです(一般に、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;
};
それはあなたが始めるはずです。残りはあなたに理解させます:)。
これは、クラスが 1 つだけのより簡潔なバージョンです。
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;
}