2015-11-01 175 views
1

说我有一个基类:模板类参数继承

class Clickable{ 
//virtual functions 
}; 

我该如何去建立一个模板类,将只接受为从可点击继承了参数类:

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

以上是否可能,如果不是,我怎么能做到我在开始时描述的?

+1

您可以对此(SFINAE)使用'std :: enable_if'或执行'static_assert'。 –

回答

2

您可以检查的基类与static_assert

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

这会给你一个编译时错误,如果T不是从Clickable的。

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的数组,这当然是不允许的。