dic*_*ccy 4 c++ templates template-meta-programming
对不起,我的英语很差,我会努力做到最好.
我想设计一个应该像这样使用的接口:
class MyObject : public IMyInterface<MyObject>
{
// ...
};
Run Code Online (Sandbox Code Playgroud)
界面可能如下所示:
template <class _TMyObject>
class IMyInterface
{
virtual _TMyObject* Get() = 0;
};
Run Code Online (Sandbox Code Playgroud)
我正在寻找的是一种在编译时验证接口是否按预期使用的方法.如何测试_TMyObject"是-a" IMyInterface<_TMyObject>?在接口定义中,例如使用static_assert.
谢谢你的帮助 :).祝你今天愉快!
你不能放入static_assert类本身,因为它D是一个不完整的类型,但你可以将它放在析构函数(或构造函数,但可以有许多构造函数):
template<class D>
struct B
{
~B()
{
static_assert(std::is_base_of_v<B, D>);
};
};
struct Not_E {};
struct D : B<D> { };
struct E : B<Not_E> { };
void foo()
{
D d; // OK
E e; // Fails
}
Run Code Online (Sandbox Code Playgroud)
加成.请注意,此解决方案不能完全防止错误使用CRTP.请参考一些程序员Dude的答案,找出一个不能被它捕获的错误示例.