2010-10-02 3 views
1

Est-il possible de renvoyer le type d'un objet? Par exemple, je voudrais avoir construire comme ceci:Renvoyer un type d'objet;

//pseudocode 
    template<class T> 
    void f(int value) 
    { 
    //depends on type T different action can be taken 
    } 

template<class T> 
type getType(T obj) 
{ 
return (type of obj); 
} 

puis dans le principal:

f<getType(Object)>(value); 

Répondre

5

Oui dans un certain sens, mais vous devez déplacer T dans un paramètre. C'est l'astuce conditionnelle exploré par Eric Niebler et expliqué here.

template<typename T> 
struct id { typedef T type; }; 

template<typename T> 
id<T> make_id(T) { return id<T>(); } 

struct get_type { 
    template<typename T> 
    operator id<T>() { return id<T>(); } 
}; 

#define pass_type(E) (true ? get_type() : make_id((E))) 

pass_type(expression) donne un objet id<T> de telle sorte que T est le type cv-inconditionnel de cette expression. Donc, vous pouvez le faire

template<class T> 
void f(int value, id<T>) 
{ 
    // Now go on as usual on T 
} 

f(value, pass_type(Object)); 
+0

C'est génial. – GManNickG

0

En C++ 0x, il est decltype et automatique qui peut être utilisé

0

Dans la métaprogrammation de modèle, cela se fait normalement via des modèles de classe.

template <typename T> 
struct GetType 
{ 
    typedef T type; // usually it's something more complex 
}; 

// example: partial specialization is used to compute element type of some container template 
template <typename T> 
struct GetType< MyContainerType<T> > 
{ 
    typedef T type; 
}; 


......................... 

// and now you use it: 
f<GetType<Object>::type>(value); 

Ici, struct GetType<T> peut être considéré en fonction (méta) avec un argument de type et de retourner une valeur de type.

0

Je pense que vous avez juste besoin d'utiliser la spécialisation de modèle de fonction:

template<> 
void f(int value) 
{ 
    .. operations when an int 
} 


template<> 
void f(char value) 
{ 
    .. operations when a char 
} 


template<> 
void f(double value) 
{ 
    .. operations when a double 
} 


template<class T> 
void f(T value) 
{ 
    .. operations when a T (not int, char or double) 
} 
+0

Je pense que c'est tout. Je vais le vérifier demain et je vous le ferai savoir. Merci pour votre réponse. –

+0

En quoi est-ce différent de la surcharge de fonction? – atzz

+0

Puisqu'il s'agit d'une fonction simple, je suppose que ce n'est pas vraiment différent, donc juste une surcharge de fonction suffirait, mais le modèle fourre-tout final serait toujours nécessaire. – JBRWilkinson

Questions connexes