C++验证模板类型

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.

谢谢你的帮助 :).祝你今天愉快!

Evg*_*Evg 6

你不能放入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的答案,找出一个不能被它捕获的错误示例.

  • @diccy请注意,这允许像`struct F:B <D> {};`这样的东西 (2认同)