1

次のようなクラス テンプレートがあります。

template<class T>
class A;

そしてTが である場合Pair<T1, T2>、私はそれを専門としています。

template<class T1, class T2>
class A<Pair<T1, T2>>;

そして、ペアから派生したクラスがあります

class D : public Pair<int, char>
{};

を使うときA<D>は専用版を使えばいいのですが、そうではありません。Pair または他の特殊なバージョンから派生した多くのクラスがあります。自動的に行う方法は?

4

2 に答える 2

1

それが機能しなかった理由は、ペアから継承するクラスではなく、ペアに特化したためです(一般に、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;                                                                      
}  
于 2013-10-05T05:55:39.530 に答える