OVH Cloud OVH Cloud

Identifier le type d'un template

1 réponse
Avatar
Benoit Chanclou
Bonjour,
je souhaite créer des identifiants textes associés à un type. J'ai pensé
utiliser 'typeid', le problème c'est que pour cela il me faut une
instance de la classe, et je ne l'ai pas forcément ou ne souhaite pas la
créer.

En gros avoir une fonction statique du type
Connector< UnTypeQuelconque >::getId( "toto" )
qui retourne quelquechose du genre
"totoUnTypeQuelconque"

Il y a ce code qui fonctionne mais je suis obligé de créer un objet
temporaire. Ca peut avoir un coût, voire être impossible si aucun
constructeur par défaut n'est fourni.

template< typename Type >
class Connector
{
static std::string getId( const std::string& id )
{
// Fonctionne mais crée une variable temporaire
Type t ;
return PsName( id + typeid(t).name() ) ;
}
} ;


Et sans instance ça ne peut pas fonctionner !

template< typename Type >
class Connector
{
static std::string getId( const std::string& id )
{
// Ne fonctionne pas :-(
Type *p = 0 ;
return PsName( id + typeid(*p).name() ) ;
}
} ;

1 réponse

Avatar
Benoit Chanclou
Benoit Chanclou wrote:
Bonjour,
je souhaite créer des identifiants textes associés à un type. J'ai pensé
utiliser 'typeid', le problème c'est que pour cela il me faut une
instance de la classe, et je ne l'ai pas forcément ou ne souhaite pas la
créer.

En gros avoir une fonction statique du type
Connector< UnTypeQuelconque >::getId( "toto" )
qui retourne quelquechose du genre
"totoUnTypeQuelconque"

Il y a ce code qui fonctionne mais je suis obligé de créer un objet
temporaire. Ca peut avoir un coût, voire être impossible si aucun
constructeur par défaut n'est fourni.

template< typename Type >
class Connector
{
static std::string getId( const std::string& id )
{
// Fonctionne mais crée une variable temporaire
Type t ;
return PsName( id + typeid(t).name() ) ;
}
} ;


Et sans instance ça ne peut pas fonctionner !

template< typename Type >
class Connector
{
static std::string getId( const std::string& id )
{
// Ne fonctionne pas :-(
Type *p = 0 ;
return PsName( id + typeid(*p).name() ) ;
}
} ;


désolé d'avoir polluer avant de réfléchir, j'ai trouvé !!
Avec le code suivant on a le type du pointeur sur le type au lieu du
type lui même, mais cela me convient parfaitement

template< typename Type >
class Connector
{
static std::string getId( const std::string& id )
{
// fonctionne :-)
return PsName( id + typeid((Type*)p).name() ) ;
}
} ;