2010-12-04 22 views
7

Comment vérifier à l'aide d'un hack de modèle si un argument template passé est de type classe?Vérifier si un argument de modèle est d'un type de classe?

Exemple

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

Pourquoi avez-vous besoin de savoir? –

Répondre

7

SFINAE devrait faire votre travail

#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: ligne 7: erreur C2056: expression illégale – bjskishore123

+0

@UpVoter: Oh ideone a compilé le code en mode C++ 0x. Mise à jour ma réponse (pour C++ 03). –

+0

Wow! J'ai besoin de comprendre comment le code fonctionne réellement. Merci. – NEWBIE

2

C++ 0x offre une solution très simple:

#include <iostream> 
#include <type_traits> 

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

Code qui compile avec MSVC++ 08 AUSSI, ainsi qu'avec GCC, Comeau et Clang (édité).

#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 ... pourriez-vous s'il vous plaît compiler ce sur Comeau, et Clang ... et dites-moi si elle est compilé ou non? Merci!

+0

Oui, il est compilé sur ceux :-) –