5

たとえば、特定のクラスから継承したり、型特性を介して表現できる他の制約に準拠したりするクラス型にのみ使用される部分的なテンプレートの特殊化を作成することは可能ですか?つまり、次のようなものです。

class A{}

class B : public A{}

template<typename T>
class X{
    int foo(){ return 4; }
};

//Insert some magic that allows this partial specialization
//only for classes which are a subtype of A
template<typename T> 
class X<T>{
    int foo(){ return 5; }
};

int main(){
    X<int> x;
    x.foo(); //Returns 4
    X<A> y;
    y.foo(); //Returns 5
    X<B> z;
    z.foo(); //Returns 5
    X<A*> x2; 
    x2.foo(); //Returns 4
}
4

1 に答える 1

13

通常、条件付きの部分的なテンプレートの特殊化が必要な場合は、追加のパラメーターを指定してから、enable_if を使用する必要があります。

template<typename T, typename=void>
class X {
public:
    int foo(){ return 4; }
};

template<typename T>
class X<T, std::enable_if_t<std::is_base_of_v<A, T>>> {
public:
    int foo(){ return 5; }
};
于 2012-08-28T14:07:48.480 に答える