使用这样的模板时:
class A {...}
class B : A {...}
class C : A {...}
template<typename T>
class D{...}
Run Code Online (Sandbox Code Playgroud)
我需要T只能是B或C.这意味着T必须是A的推导.
有没有办法做到这一点?谢谢!
使用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将两种B或C,那么你需要修改它,使用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结合使用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)
| 归档时间: |
|
| 查看次数: |
333 次 |
| 最近记录: |