2015-11-01 217 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的數組,這當然是不允許的。