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

C++ Discussion :

Métaprogrammation, T par valeur ou référence ?


Sujet :

C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut Métaprogrammation, T par valeur ou référence ?
    Bonjour à tous,

    J'ai une classe template de ce style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    template<class T>
    {
    public:
        void SetValue(const T& tValue);
        const T& GetValue();
    private:
        T m_tValue;
    };
    Je passe et récupère T par référence. Mais si la taille de T est inférieur à la taille d'une référence, ou d'un pointeur, mieux vaut travailler avec des valeurs (dans le cadre de bool, int, char etc...).

    J'avais vu une astuce pour choisir automatiquement le choix de passer par valeur ou référence, mais j'ai pas retrouvé le sujet sur le forum.

    J'ai une idée, ça serait de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    template<class T>
    class RefType
    {
    typedef T& value_type; // par défaut on prend la référence
    };
     
    template<>
    class RefType<bool>
    {
    typedef bool value_type; // Ici on prend par valeur
    };
    J'ai pensé également à ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    template<class T, bool b>
    class ByRef
    {
    typedef T& value_type;
    };
     
    template<class T>
    class ByRef<T, false> // Je sais pas si ça compile mais l'idée est là
    {
    typedef T value_type;
    };
     
    ByRef<T, sizeof(T)> val;
    Mais il me semble sur sizeof(T) est une expression dynamique, donc le compilateur n'en voudra pas.

    Vous pouvez m'aider ?

    Merci,

    A bientôt

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Tu peux regarder comment est fait boost::call_traits<T>::param_type qui correspond à ce que tu veux faire.

    [EDIT]: ce que tu cherches est dans l'article de Alp sur les classes politiques et traits (1-3 rechercher 'CallTraits' ).

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Je me posais la même question à propos du passage de paramètre par valeur ou par référence il n'y a pas si longtemps:
    http://www.developpez.net/forums/d68...nst-reference/

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Merci beaucoup,

    Je vais checker ça

    A bientôt

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Tu peux regarder comment est fait boost::call_traits<T>::param_type qui correspond à ce que tu veux faire.

    [EDIT]: ce que tu cherches est dans l'article de Alp sur les classes politiques et traits (1-3 rechercher 'CallTraits' ).
    Surprenant et impressionnant ! On en apprend tous les jours
    Les algos de la STL devrait être recodée en utilisant ces astuces au lieu d'imposer tantôt la valeur tantôt la référence dans le passage des paramètres.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Ha bah oui, il utilise ce que j'avais pensé plus haut, à savoir un paramètre booléen à positionner à la valeur "sizeof(T) > 8".

    J'ai pas cherché à implémenter ça car j'avais eu pas mal de problème avec le sizeof, le compilateur me le rejetait en me disant que l'expression n'était pas constante...

    J'avais dû faire une erreur, je vais donc l'implémenter tout à l'heure.

    Merci,

    Aurélien

Discussions similaires

  1. fonction:passage par valeur ou référence
    Par senvedgi dans le forum Débuter
    Réponses: 10
    Dernier message: 01/01/2012, 17h58
  2. [XL-97] Comparaison de valeur par rapport à une référence et insertion d'un statut OK ou NOK
    Par Kartoon67 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 27/05/2009, 09h22
  3. Réponses: 36
    Dernier message: 06/03/2009, 11h00
  4. passage paramètre par valeur et référence
    Par new_wave dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 09/03/2008, 18h53
  5. Passage par référence et non pas par valeur
    Par GPZ{^_^} dans le forum Flash
    Réponses: 2
    Dernier message: 14/05/2007, 15h21

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