模板类参数继承

时间:2015-11-01 08:00:59

标签: c++ templates inheritance

说我有一个基类:

class Clickable{
//virtual functions
};

如何创建一个只接受从Clickable继承的参数类的模板化类:

template < class T : public Clickable > class scrollingList{
    std::vector<T> elements;
    //...
};

以上是否可能,如果没有,我怎么能做我刚开始描述的内容?

2 个答案:

答案 0 :(得分:2)

您可以使用static_assert

检查基类
static_assert(std::is_base_of<Clickable, T>::value, "Wrong base type!");

如果T不是来自Clickable,那么这会给您一个编译时错误。

答案 1 :(得分:1)

对于C ++ 11及更高版本来说,Bo Persson的答案是正确的答案;但如果您受限于早期版本的C ++,则以下内容应该有效:

char is_clickable(void*);
char (&is_clickable(Clickable*))[3];

template<typename T> class ScrollingList
{
  typedef int dummy[(int)sizeof(is_clickable((T*)0))-2];
  std::vector<T> elements;
  ...
};

这里的技巧是,如果T不是从Clickable派生的,则重载决策将选择第一个重载,如果是{{1}},则选择第二个重载。但是,第一个将导致声明大小为-1的数组,这当然是不允许的。