首页 > 解决方案 > C++ 验证模板类型

问题描述

对不起我的英语不好,我会尽力做到最好。

我想设计一个应该像这样使用的界面:

class MyObject : public IMyInterface<MyObject>
{
    // ...
};

界面可能如下所示:

template <class _TMyObject>
class IMyInterface
{
    virtual _TMyObject* Get() = 0;
};

我正在关注的是一种在编译时验证接口是否按预期使用的方法。如何测试_TMyObject“is-a”IMyInterface<_TMyObject>是否?在接口定义中,例如带有 static_assert 。

谢谢你的帮助 :)。祝你今天过得愉快!

标签: c++templatestemplate-meta-programming

解决方案


不能放在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
}

添加。请注意,此解决方案不能完全防止错误使用 CRTP。请参阅Some Programmer Dude的回答,以获取无法被它捕获的错误的一个很好的例子。


推荐阅读