说我有一个基类:模板类参数继承
class Clickable{
//virtual functions
};
我该如何去建立一个模板类,将只接受为从可点击继承了参数类:
template < class T : public Clickable > class scrollingList{
std::vector<T> elements;
//...
};
以上是否可能,如果不是,我怎么能做到我在开始时描述的?
说我有一个基类:模板类参数继承
class Clickable{
//virtual functions
};
我该如何去建立一个模板类,将只接受为从可点击继承了参数类:
template < class T : public Clickable > class scrollingList{
std::vector<T> elements;
//...
};
以上是否可能,如果不是,我怎么能做到我在开始时描述的?
您可以检查的基类与static_assert
static_assert(std::is_base_of<Clickable, T>::value, "Wrong base type!");
这会给你一个编译时错误,如果T
不是从Clickable
的。
对于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的数组,这当然是不允许的。
您可以对此(SFINAE)使用'std :: enable_if'或执行'static_assert'。 –