我想在我的C ++程序中写道:
class A {
public:
void a();
}
template <class B extends A>
class C {
B instance;
}
这可能吗?换句话说:C ++是否允许我说模板中的类是其他东西的子类?
答案 0 :(得分:5)
定义一个名为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
听起来不错!
答案 1 :(得分:4)
不是直接的。但您可以将static_assert与type_traits一起使用,如下所示:
static_assert(is_base_of<A,B>::value, "C<B> requires B:A");
例如,您可以将它放在构造函数中,如果不满足要求,则无法编译。请注意,这是所有C ++ 11的东西,但在此之前很久就存在于Boost中,或者如果您真的被卡住了(它不需要语言支持),您可以自己编写代码。