2012-03-23 4 views
0

J'écris certaines fonctions d'aide pour un projet sur lequel je travaille. J'ai toujours voulu un opérateur de typeof. Je sais qu'il n'existe pas dans mon IDE actuel (visual studio '10), donc j'essaye d'écrire une implémentation pour cela. Il devrait fonctionner quelque chose comme ceci:Opérateur Typeof() dans vC++

auto var = new typeof(<expression>); 

Il devrait juste être un type de compilation récupérable basé sur l'expression et devrait être possible. C++ utilise ce lors de l'induction des arguments de modèle, par exemple:

template< typename A > 
void foo(A unused) { 
/* can be invoked like foo(5) with A = int  */ 
    typedef A type; 
    type * used = new type; 
} 

donc je pensais que je pouvais jouer avec MACROES, des classes et des modèles .. quelque chose comme ceci:

#define typeof(expression) (_type_creater().inducer(expression)::type) 

template<typename T> 
class _type_holder{ 
public: 
    typedef T type; 
}; 

class _type_creater{ 
public: 
template< class B > 
    _type_holder<B> inducer(B _temp) { 
     /* Here compiler induces the templated expression and creates a typename out of it. 
      this we can use extract typename from _type_holder, except a instantiatet type apparantly 
      doesn't have access to typedef'd typenames. 
     */ 
     return _type_holder<B>(); 
    } 
}; 

Le problème est donc essentiellement, que c'est illégal:

struct a 
{ 
    typedef int type; 
} 
... 
a mya; 
new mya::type; //or mya.type 

Alors la première question est, pourquoi est-ce illégal? Pourquoi ne pouvez-vous pas récupérer les noms de types des types instantiatet? Deuxième question, est-ce que je peux le faire? J'ai essayé de chercher un boosts TYPEOF, mais je n'ai pas pu le comprendre, et il semble qu'il n'utilise que des bugs dans les compilateurs VC ("//VC7.0 specific bugfeature", "//VC8.0 specific bugfeature", "//Ceci utilise de bonnes fonctionnalités de bug VC6.5 et VC7.1 "). Suis-je pas de chance?

+3

"* J'ai toujours voulu un opérateur typeof Je sais qu'il n'existe pas dans mon IDE actuel (visual studio '10) *" Oui c'est le cas - ça s'appelle ['decltype''] (http: // msdn.microsoft.com/en-us/library/dd537655.aspx). – ildjarn

+0

@ildjarn je t'aime merci. Je ne sais pas comment j'ai oublié. Quant à la première question, cependant ...? – Shaggi

+0

Je ne sais pas quelle réponse vous cherchez. La syntaxe est illégale - vous voulez savoir _why_ c'est illégal? Je ne pense pas que quiconque ne siège pas au comité ISO C++ puisse raisonnablement répondre à cette question. – ildjarn

Répondre

0

Un objet n'est pas une portée. L'opérateur de résolution d'étendue (::) s'applique uniquement aux étendues (étendue de classe, portée d'espace de noms, portée globale (espace de noms)). J'ai donné un peu d'information supplémentaire en tant que théorie dans un commentaire sur la question.