基本上我有4节课:


虚空
Meta:继承OverVoid
物理:与以上无关
移动:模板化的类


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

class OverVoid{
public:

    virtual ~OverVoid(){
    };
};

class Meta: public OverVoid{

};

class Physical{
public:
};

template<typename _Ty>
class Move{

};


我希望在编译时消除错误,
我知道有一种方法可以使用Boost,但是我不能使用Boost(我公司的开发问题)

有任何想法吗?

最佳答案

您可以隐藏非OverVoid类型的类的模板定义

template<typename _Ty,
         class = typename std::enable_if<std::is_base_of<OverVoid, _Ty>::value>::type>
class Move{

};


然后,当您尝试编译非OverVoid类型的类时,您会收到一条错误消息。

int main() {

  Move<Meta> a;
  Move<OverVoid> b;
  Move<Physical> c;
  // your code goes here
  return 0;
}


错误:

prog.cpp: In function 'int main()':
prog.cpp:29:15: error: no type named 'type' in 'struct std::enable_if<false,    void>'
Move<Physical> c;

10-06 07:14