我想确保在以下模板化类 B 的定义中,类 A 派生自抽象类 C。我可以这样做吗?
template <class A>
class B {
// A must derive from C
...
};
我正在使用 C++11。
我想确保在以下模板化类 B 的定义中,类 A 派生自抽象类 C。我可以这样做吗?
template <class A>
class B {
// A must derive from C
...
};
我正在使用 C++11。
template <class A>
class B {
static_assert(std::is_base_of<C, A>::value
, "A must derive from C");
//...
};
请注意,这is_base_of<C, C>::value
是真的,因此您可能还想使用std::is_same
to ensure A
is not 实际上C
本身:
static_assert(std::is_base_of<C, A>::value && !std::is_same<C, A>::value
, "A must derive from C");
总的来说,这是一个SFINAE问题。
在 C++11 中有更好的方法,但如果你使用的是 C++03,你可以尝试这样的事情:
template <class A>
class B {
public:
B() { dummy((A*)0); }
private:
void dummy(C *test) {}
};
也就是说,添加采用类型指针的虚拟函数C
。然后从您的构造函数调用它,其值为 type A*
。这不能为A
不派生自的类型编译C
。