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)
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. –
Votre code fonctionne avec VS2010. – mkaes
@mkaes, c'est en fait assez intéressant. Maintenant, nous avons aussi la question: est-ce que la norme le permet? –