2011-06-29 2 views
2

J'essaie d'écrire un wrapper de modèle qui fonctionne avec le type smart_ptr et qui doit dans certains cas lever une exception. Pour ce cas, j'aimerais inclure le nom du type que la classe enveloppe. Comme je travaille avec des pointeurs intelligents, seules les déclarations anticipées seront disponibles pour le type.Obtention du nom de type d'un type de modèle, sans définition de classe

Donc la question essentielle est comment puis-je obtenir une chaîne pour un paramètre de modèle sans avoir sa définition disponible? (Je n'ai pas besoin d'un nom propre, tout ce qui ressemble au nom sera bon)

Ma tentative d'utilisation de typeid échoue car elle nécessite la définition de la classe (au moins dans GCC).

Le code que je dois essentiellement travailler est au-dessous (qui donne une erreur dans GCC)

#include <boost/shared_ptr.hpp> 

using boost::shared_ptr; 
class SomeClass; 

void func(shared_ptr<SomeClass> obj); 

template<class T> 
class Wrap 
{ 
    shared_ptr<T> ptr; 
public: 
    shared_ptr<T> get() 
    { 
     if(!ptr) 
      throw std::string(typeid(T).name()); 
     return ptr; 
    } 
}; 

extern Wrap<SomeClass> wrapSomeClass; 

int main() 
{ 
    func(wrapSomeClass.get()); 
} 

(Cette configuration a conduit à mon précédent mal déclaré question - le message d'erreur est une sorte de confusion)

+0

Soyez prudent lorsque vous utilisez des types incomplets avec des pointeurs intelligents. Si vous utilisez votre propre mécanisme de destruction, cela peut entraîner une corruption de la mémoire. –

+0

Votre code fonctionne avec VS2010. – mkaes

+0

@mkaes, c'est en fait assez intéressant. Maintenant, nous avons aussi la question: est-ce que la norme le permet? –

Répondre

1

Vous pouvez écrire un générateur de code qui crée un modèle tel que type_string spécialisé pour tous les types requis et utiliser ce modèle pour obtenir une chaîne. Je ne peux pas penser à un autre moyen qui n'a pas besoin de la définition complète.

0

D'accord, j'ai trouvé quelques possibilités; mais j'espère que quelqu'un d'autre peut trouver une meilleure réponse.

  1. utiliser une macro pour créer le extern, puisque le jeton # pourrait saisir le nom, il devrait être assez facile d'obtenir cette chaîne au modèle.

  2. Si je ne me soucie pas vraiment de la chaîne lancée, je peux faire typeid(T*) puisque cela n'a apparemment pas besoin du type.

Questions connexes