2010-10-10 5 views
1
template<class T> 
struct IsFunc 
{ 
    typedef char one; 
    typedef struct 
    { 
     char dummy_[2]; 
    } two; 

    static one f(...); 

    static two f(T (*)[1]); 
    enum {value = (sizeof(f<T>(0)) == 1)}; 
}; 

Et si je tente de l'exécuter dans le principal:détecter si le type est une fonction

void functionA(); 
    int _tmain(int argc, _TCHAR* argv[]) 
    { 
     int a = 0; 
     cout << IsFunc<functionA>::value;//<=--------HERE 

     return 0; 
    } 

Je reçois une erreur:
Erreur 1 erreur C2923: 'IsFunc': « fonctionn 'n'est pas un type de modèle valide
Qu'est-ce que je fais mal?
Merci

Répondre

3

functionA est une fonction, pas un type, donc il ne peut pas être un paramètre de modèle valide pour IsFunc qui attend un type.

Si vous avez besoin d'un modèle pour détecter si un type est un type de fonction, il existe déjà boost::is_function (qui fait partie de TR1/C++ 0x).

+0

IsFunc d'autre part, est très bien :) –

+0

@Armen: C'est parce que 'void()' est un identifiant de type. La norme dit 'Un argument de modèle pour un paramètre de modèle qui est un type doit être un type-id.' –

+0

@Kenny && Armen est-il donc un moyen de vérifier si identyfier est une fonction? –

1

Si vous avez template<class T> class X; vous ne vous attendez pas X<3> à travailler et à en déduire que T est int, pensez-vous? La même chose est ici IsFunc<FunctionA> est invalide, mais IsFunc<void()> est très bien. HTH

+0

@Armen oui, vous avez absolument raison, même si ce serait bien si cela fonctionnait de cette façon, pourquoi pas? –

+0

@There: Ce serait bien si la sémantique du programme a été déduite par le compilateur à partir des commentaires, vous ne pensez pas? :))))) –

+0

@Armen bien je pense que ce que j'ai dit n'est pas idiot et illogique, n'est-ce pas? –

1

D'autres ont déjà indiqué la raison mais cela vous aiderait-il?

#include <type_traits> 
#include <typeinfo> 
namespace 
{ 
    template<typename T> 
    bool test_if_function (T const &v) 
    { 
     return std::tr1::is_function<T>::value; 
    } 

    void functionA() 
    { 
    } 
} 

int main() 
{ 
    printf ("%d\r\n", test_if_function (1)); 
    printf ("%d\r\n", test_if_function (functionA)); 

    return 0; 
} 
+0

Nécessite TR1 évidemment ... – FuleSnabel

Questions connexes