我想在我的 C++ 程序中编写如下内容:
class A {
public:
void a();
}
template <class B extends A>
class C {
B instance;
}
这可能吗?换句话说:C++ 允许我说模板中的类是其他类的子类吗?
最佳答案
定义一个名为 extends
的元函数(这只是一个糖衣名字)如:
template<typename D, typename B>
using extends = std::is_base_of<B,D>;
然后将您的类定义为:
template <class B>
class C
{
//here you can check it, and generate your own error message!
static_assert(extends<B,A>(),
"Constraint Violation: B doesn't derive from A.");
B instance;
};
或者,你可以这样写:
//define it a bit differently now!
template<typename D, typename B>
using extends = typename std::enable_if<std::is_base_of<B,D>::value>::type;
template <class B, class Unused=extends<B,A>>
class C
{
B instance;
};
但在这种情况下,您没有机会生成自己的错误消息。编译器可以随意向您抛出任何错误消息,这可能难以理解。
无论如何,您可能意识到可以使用 std::is_base_of<>
直接地。但如果你正在寻找糖衣名字,那么extends
听起来不错!
关于C++ 类继承和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20266052/