IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Typetrait et Specialisation


Sujet :

Langage C++

  1. #1
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut Typetrait et Specialisation
    Bonjour,

    Je dois implémenter mes propres fonction de RTTI pour avoir le nom d'un type.
    Pour ce faire c'est assez simple théoriquement:
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class RTTI
    {
    public:
    	template < typename Type >
    	static
    	Core::String	GetTypeName( Type const& tInstance );
     
    	template < typename Type >
    	static
    	Core::String	GetName();
    };

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    template < typename Type >
    inline
    Core::String	RTTI::GetName()
    {
    	return RTTI::GetTypeName( Type() );
    }
     
    template < typename Type >
    inline
    Core::String	RTTI::GetTypeName( Type const& tInstance )
    {
    	return tInstance.GetRTTIType().Name();
    }
     
    // Après c'est les spécialisations...
    template <>
    inline
    Core::String	RTTI::GetTypeName< u8 >( u8 const& /*tInstance*/ )
    {
    	return _T( "u8" );
    }
     
    template <>
    inline
    Core::String	RTTI::GetTypeName( u16 const& /*tInstance*/ )
    {
    	return _T( "u16" );
    }
     
    template <>
    inline
    Core::String	RTTI::GetTypeName( u32 const& /*tInstance*/ )
    {
    	return _T( "u32" );
    }
     
    // ...

    J'ai besoin de gérer les versions avec pointeurs.
    Et là ça se complique, voilà ce que j'ai essayé:
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template < typename TheType >
    inline
    Core::String	RTTI::GetName()
    {
    	typedef typename std::conditional<	std::is_pointer< TheType >::value,
    										std::remove_pointer< TheType >::type,
    										TheType >::type	UsedType;
     
    	return RTTI::GetTypeNamePtr( UsedType() ); // Retourne le nom du type + _T( '*' )
    }
    Là j'ai un "error : incomplete type is not allowed"

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    template < typename Type >
    inline
    typename std::enable_if< std::is_pointer< Type >::value, Core::String >::type
    	RTTI::GetTypeName( Type const& tInstance )
    {
    	return tInstance.GetRTTIType().Name();
    }
     
    template < typename Type >
    inline
    typename std::disable_if< std::is_pointer< Type >::value, Core::String >::type
    	RTTI::GetTypeName( Type const& tInstance )
    {
    	return tInstance.GetRTTIType().Name();
    }
    Là par contre c'est les spécialisations qui fail.
    Mes autres méthodes spécialisés ne peuvent plus être utilisés.
    "error : no instance of overloaded function "RTTI::GetTypeName" matches the specified type".

    Information complémentaire j'utilise Intel C++ 14

    Si vous avez une idée je suis preneur.

    Merci

  2. #2
    Futur Membre du Club
    Homme Profil pro
    ce que j'ai envie de faire sur le moment
    Inscrit en
    Juillet 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : ce que j'ai envie de faire sur le moment

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2
    Points : 5
    Points
    5
    Par défaut
    Bonjour, je pense que tu n'a pas utilisé la bonne méthode pour faire de la RTTI, l'utilisation des fonctions virtuels me semble plus appropriée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    #include <iostream>
    class Type {
        public:
            virtual const char* typeName(){
                return "type";
            }
     
            virtual ~Type(){
            }
    };
     
    class Type2 : public Type {
        public:
            virtual const char* typeName(){
                return "type2";
            }
     
            virtual ~Type2(){
            }
    };
     
    int main()
    {
        Type* t = new Type;
        std::cout << t->typeName() << std::endl;
        delete t;
        t = new Type2;
        std::cout << t->typeName() << std::endl;
        return 0;
    }

Discussions similaires

  1. [Etudes] spécialisation Lotus ou Exchange ?
    Par samarchpa dans le forum Stages
    Réponses: 15
    Dernier message: 17/02/2009, 17h04
  2. Reorientation ou specialisation
    Par black.out dans le forum Etudes
    Réponses: 6
    Dernier message: 19/06/2006, 14h56
  3. Réponses: 5
    Dernier message: 29/12/2005, 21h27
  4. Faut t'il se specialiser ?
    Par vedder dans le forum Emploi
    Réponses: 14
    Dernier message: 17/07/2005, 12h54
  5. [VB6]Déclaration d'un Constructeur Spécialisé
    Par TagadaTsoin dans le forum VB 6 et antérieur
    Réponses: 21
    Dernier message: 26/05/2004, 14h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo