c ++模板专业化和派生

Jin*_* Yu 4 c++ templates

使用这样的模板时:

class A {...}
class B : A {...}
class C : A {...}

template<typename T>
class D{...}
Run Code Online (Sandbox Code Playgroud)

我需要T只能是B或C.这意味着T必须是A的推导.

有没有办法做到这一点?谢谢!

Naw*_*waz 5

使用std::is_base_of连同std::enable_if:

template<typename T, typename X = std::enable_if<std::is_base_of<A, T>::value>::type>
class D{...}
Run Code Online (Sandbox Code Playgroud)

请注意,T只要它来源,它就会接受任何A.如果您需要T将两种BC,那么你需要修改它,使用std::is_same和/或std::conditional沿std::enable_if.

你可以把它弄得像:

template<typename T, typename Unused = extends<T,A>>
class D{...}
Run Code Online (Sandbox Code Playgroud)

其中extends定义为:

template<typename D, typename B>
using extends = typename std::enable_if<std::is_base_of<B,D>::value>::type;
Run Code Online (Sandbox Code Playgroud)

static_assert如果您希望它导致错误和编译失败,也可以使用(如其他答案所示).但是,如果您需要选择或取消选择,例如来自许多专业,那么请使用上述方法.

希望有所帮助.

  • 为什么不``static_assert`? (3认同)

m.s*_*.s. 5

您可以static_assert结合使用std::is_base_of:

#include <type_traits>

class A {};
class B : A {};
class C : A {};
class X{};

template<typename T>
class D
{
    static_assert(std::is_base_of<A,T>::value, "T must be derived from A");
};

int main()
{
    D<C> d_valid;
    D<X> d_fails; // compilation fails

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

live on ideone