编译时间模板限制C++

Wis*_*lil 0 c++ polymorphism inheritance templates

基本上我有4个班:

  • OverVoid
  • Meta:继承OverVoid
  • 物理:与上述无关
  • 移动:模板类

我希望move的模板接受只有OverVoid类型的对象,即Ove​​rVoid和Meta.

class OverVoid{
public:

    virtual ~OverVoid(){
    };
};

class Meta: public OverVoid{

};

class Physical{
public:
};

template<typename _Ty>
class Move{

};
Run Code Online (Sandbox Code Playgroud)

我想在编译时输入一个错误,我知道有一种方法可以使用boost但我不能使用Boost(与我公司的dev问题)

有任何想法吗?

Bar*_*rry 5

最简单的事情就是static_assert:

template<typename _Ty>
class Move {
    static_assert(std::is_base_of<OverVoid, _Ty>::value, 
                  "_Ty must inherit from OverVoid.");
};
Run Code Online (Sandbox Code Playgroud)

请注意,这允许OverVoid是私有或不可访问的基础.如果您想要求它是公共基础,您可以要求:

    static_assert(std::is_convertible<_Ty*, OverVoid*>::value, 
                  "_Ty must inherit publicly from OverVoid.");
Run Code Online (Sandbox Code Playgroud)