說我有一個基類:模板類參數繼承
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'。 –