2010-12-04 106 views
7

如何使用一些模板檢查傳遞的模板參數是否是類類型?檢查模板參數是否是類類型?

int main() 
{ 
    CheckIfClass<int>::checkConst ; No it is not of a class type 
    class CLASS{}; 
    CheckIfClass<CLASS>::checkConst ; Yes CLASS is a class. 
    CheckIfClass<std::string>::checkConst ; Yes std::string is a class 
} 
+0

爲什麼你需要知道? – 2010-12-04 06:29:46

回答

7

SFINAE應該做你的工作

#include <iostream> 
template<typename T> 
struct Check_If_T_Is_Class_Type 
{ 
    template<typename C> static char func (char C::*p); 
    template<typename C> static int func (...); 
    enum{val = sizeof (Check_If_T_Is_Class_Type<T>::template func<T>(0)) == 1}; 
}; 
class empty{}; // Defined the class in the global namespace. 
       // You can't have local classes as template arguments in C++03 

int main() 
{ 

    std::cout<<Check_If_T_Is_Class_Type<empty>::val; // 1 
    std::cout<<Check_If_T_Is_Class_Type<int>::val; // 0 
    std::cout<<Check_If_T_Is_Class_Type<std::string>::val; //1 
} 

Output

101 
+0

@Saurav:第7行:錯誤C2056:非法表達 – bjskishore123 2010-12-04 06:40:59

+0

@UpVoter:Oh ideone以C++ 0x模式編譯代碼。更新了我的答案(對於C++ 03)。 – 2010-12-04 06:46:29

2

的C++ 0x提供了一個非常簡單的解決方案:

#include <iostream> 
#include <type_traits> 

int main() 
{ 
    std::cout << is_class<your_type_here>::value << std::endl; 
} 
1

使用MSVC++ 08編譯的代碼,以及GCC,Comeau和Clang(已編輯)。

#include <iostream> 
template<typename T> 
struct Check_If_T_Is_Class_Type 
{ 
    template<typename C> static char func (char C::*p); 
    template<typename C> static int func (...); 
    enum{val = sizeof (func<T>(0)) == 1}; 
}; 
class empty{}; 
int main() 
{ 
    std::cout<<Check_If_T_Is_Class_Type<empty>::val; // 1 
    std::cout<<Check_If_T_Is_Class_Type<int>::val; // 0 
    std::cout<<Check_If_T_Is_Class_Type<std::string>::val; //1 
} 

@Prasoon ...請你編譯這個在科莫,以及鏘......並告訴我,如果它被編譯或不?謝謝!

相關問題