2010-12-04 3 views
3

Possible Duplicate:
Is it possible to write a C++ template to check for a function's existence?Vérifier si un argument de modèle a une fonction membre

Ceci est très similaire à mon earlier question. Je veux vérifier si un argument template contient une fonction membre ou non.

J'ai essayé ce code similaire à celui de la réponse acceptée dans ma question précédente.

struct A 
{ 
    int member_func(); 
}; 

struct B 
{ 
}; 

template<typename T> 
struct has_member_func 
{ 
    template<typename C> static char func(???); //what should I put in place of '???' 
    template<typename C> static int func(...); 

    enum{val = sizeof(func<T>(0)) == 1}; 
}; 

int main() 
{ 
    std::cout<< has_member_func<B>::val; //should output 0 
    std::cout<< has_member_func<A>::val; //should output 1 
} 

Mais je ne sais pas ce que dois-je mettre en place de ??? pour le faire fonctionner. Je suis nouveau au concept SFINAE.

+0

Utilisez quelque chose de similaire à HAS_MEM_FUNC qui Johannes posté dans ce fil. J'ai déjà utilisé ce code et ça marche bien. –

+0

icecrime Merci d'avoir signalé qu'il s'agit d'un doublon. Cependant, la réponse acceptée utilise un opérateur typeof non standard. Pouvez-vous suggérer une alternative? Selon le commentaire de MSalter char statique func (char [sizeof (& C :: helloworld)]) devrait fonctionner? – NEWBIE

+0

@NEWBIE: voir Johannes répondre, c'est beaucoup mieux – icecrime

Répondre

1

Petite modification de l'idée de MSalters de Is it possible to write a C++ template to check for a functions existence?:

template<typename T> 
class has_member_func 
{ 
     typedef char no; 
     typedef char yes[2]; 
     template<class C> static yes& test(char (*)[sizeof(&C::member_func)]); 
     template<class C> static no& test(...); 
public: 
     enum{value = sizeof(test<T>(0)) == sizeof(yes&)}; 
}; 
+0

Je reçois cette erreur avec GCC 4.2.1: 'Dans l'instanciation de 'has_member_func ':' 'erreur: le tableau lié n'est pas une constante entière' – nilton

Questions connexes