【发布时间】:2017-08-12 18:03:01
【问题描述】:
我想要做的是让一些类继承 extention 类。问题是extention 类必须知道它正在扩展哪个类。
这可以简单地实现如下:
template<typename Self>
class Extention
{
public:
void check() const
{
std::cout << "Extention is valid: "
<< std::boolalpha
<< std::is_base_of<Extention, Self>::value
<< std::endl;
}
};
class Foo : public Extention<Foo> {};
class Bar : public Extention<void> {};
Foo 和 Bar 类显示了扩展的好坏用法。
Foo().check(); → Extention is valid: true
Bar().check(); → Extention is valid: false
我想在编译的时候检查模板的有效性,这才带我写
template<typename Self>
class Extention
{
static_assert(std::is_base_of<Extention, Self>::value);
};
但是,gcc 告诉我这个 static_assert 是错误的,因为 class Foo 的类型不完整。
我做错了什么?
编辑:我使用的是-std=c++17,错误不是static_assert中缺少错误信息
【问题讨论】:
-
您可以将
static_assert放入成员函数中,但要使其工作,您必须实例化该函数(可能通过调用它)。 -
@HolyBlackCat 将其放入构造函数中会起作用。尽管如此,如果您有多个构造函数,这将是痛苦且容易出错的......
-
不是用静态断言打击所有构造函数,而是从受保护的
Requiredived派生模板Extention是Self一个选项吗?这将为您提供一个受根保护的默认构造函数RequiredBase(),在其中挂起您的静态断言。或者我在这里误解了你的目标。 -
那么把它放到析构函数中怎么样?
-
@WhozCraig:会工作,但过度设计。 HolyBlackCat:工作起来更优雅。尽管如此,我们应该能够将断言直接放入类中......
标签: c++ templates inheritance static-assert