说我有一个基类:
class Clickable{
//virtual functions
};
如何创建一个只接受从Clickable继承的参数类的模板化类:
template < class T : public Clickable > class scrollingList{
std::vector<T> elements;
//...
};
以上是否可能,如果没有,我怎么能做我刚开始描述的内容?
答案 0 :(得分:2)
您可以使用static_assert
static_assert(std::is_base_of<Clickable, T>::value, "Wrong base type!");
如果T
不是来自Clickable
,那么这会给您一个编译时错误。
答案 1 :(得分:1)
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的数组,这当然是不允许的。