2011-06-30 60 views
11

假設我有一些模板類,具體取決於類型TT幾乎可以是任何東西:int,int*,pair <int, int>struct lol;它不能是void,參考或任何cv-qualified雖然。對於一些優化,我需要知道我是否可以繼承T。所以,我需要一些特質類型is_subclassable,這些特質被確定爲基本特徵或通過一些SFINAE技巧的邏輯組合。C++模板:如何確定類型是否適合子類化

在原始示例中,intint*不是可分類的,而pair <int, int>struct lol是。

編輯:正如以下指出的,工會也不是可分類的,並且T也可以是工會類型。

如何編寫我需要的特徵類型?

+2

嗯。 [is_class](http://msdn.microsoft.com/en-us/library/bb982638.aspx)是否足夠?不確定。 –

回答

13

你想確定它是否是一個非聯合類。我無法做到這一點(並且提升還沒有找到方法)。如果您能承受工會案件的誤判,您可以使用is_class

template<typename> struct void_ { typedef void type; }; 

template<typename T, typename = void> 
struct is_class { static bool const value = false; }; 

template<typename T> 
struct is_class<T, typename void_<int T::*>::type> { 
    static bool const value = true; 
}; 

升壓具有使用特定的編譯器內建雖然一個is_union,這將幫助你在這裏。 is_class(其中boost也提供)結合is_union將解決您的問題。

+0

我完全忘記了工會案件。不幸的是,誤報是不可接受的。錯過了,因爲這畢竟是一種優化。 – doublep

+0

@doublep然後,除非你使用C++ 0x,我不認爲它是可移植的方式解決。 –

+0

是的,我想我必須在C++ 0x支持條件下進行優化,否則就放棄它。 – doublep

相關問題