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

SL & STL C++ Discussion :

std::pair et reference


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut std::pair et reference
    Je souhaiterais que la valeur retour d'une fonction soit une paire comme cecimais ça ne compile pas.
    A l'origine la fonction renvoit une reference seule, mais j'aimerais y ajouter un bool. Comment faire ?
    Merci.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 11
    Par défaut
    Tu peut passer par un paramettre donnée-résultat. Du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T& fonction(int i, bool& b)

  3. #3
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    le plus simple étant bien souvent le moins compliqué, et un typedef ne pouvant pas être template, je serais toi, je passerais par une petite structure. Un truc dans le style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template <typename T>
    struct boolean_pair
    {
       T & Ref;
       bool Flag;
    };
     
    // et du coup la fonction aura cette tête:
    template <typename T>
    boolean_pair<T> ma_fonction( /* parametres */ );

  4. #4
    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
    Par défaut
    Salut,
    Effectivement, la norme indique bien comme constructeur pair(const T1& x, const T2& y), ce qui de facto t'empêche d'avoir T1 ou T2 comme T&...

    Sinon, la solution Rod est la plus simple. Mais généralement, ce genre de cas veut dire : si bool est vrai, alors T est valide et si bool est faux alors T n'est pas valide. Boost offre Boost.Optional pour résoudre ce genre de chose :
    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
     
    template<class T>
    boost::optional<T&> ma_fonction(T&p_)
    {
       //...
       if(ok)
       {
            return boost::optional<T&>(p_);
       }
       return boost::optional<T&)();
    }
     
    // utilisation :
    boost::optional<T&> ret = ma_fonction(param);
    if(ret){// ok!
       T&resultat = *ret;
    }
    else{//ko
    }

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Dans mon cas bool==true veut dire "T & est nouveau", bool==false veut dire "T & existe déjà" (un peu comme map::insert()).

    Sinon, ce petit débat pour tester la valeur retour d'une fonction est intéressant. J'ai lu il n'y a pas très longtemps "les solutions les plus simples sont les moins compliquées" () et le plus simple est de renvoyer un... pointeur. S'il est nul la valeur est invalide.
    Il m'est d'ailleurs déjà arrivé de faire la même chose avec des références pour lesquelles il suffit de tester leur adresse:
    T & ref=foo();
    if (&ref) valide; else invalide;

    mais ce n'est pas très sécurisant je le reconnais.

    Il semble que boost::optional conceptualize cet aspect des choses. Mais s'il ne fait "que" ça, c'est un peu lourd quand même...
    Je sais que beaucoup ici n'aime pas les pointeurs et cherche à tout prix à les cacher, mais le pointeur reste une base incontournable du C++ (abondamment utilisé il me semble dans la STL, boost, etc).

    Pour en revenir à mon petit soucis de conception, je pense que la solution de r0d semble la plus élégante.
    Concrêtement je suis en train d'écrire un cache template basique. Lorsque l'on requiert une entrée du cache via une clé on a besoin de savoir si l'entrée est nouvelle ou si elle existe déjà. Il me reste un autre petit soucis, comment faire savoir à l'appelant qu'une entrée du cache va être supprimée (je pense à un callback, un peu comme un prédicat).

  6. #6
    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
    Par défaut
    Citation Envoyé par camboui Voir le message
    Il semble que boost::optional conceptualize cet aspect des choses. Mais s'il ne fait "que" ça, c'est un peu lourd quand même...
    Ca veut dire quoi lourd ? Le bout de code que j'ai mis en exemple me semble pourtant 'simple', non?

    Citation Envoyé par camboui Voir le message
    Je sais que beaucoup ici n'aime pas les pointeurs et cherche à tout prix à les cacher, mais le pointeur reste une base incontournable du C++ (abondamment utilisé il me semble dans la STL, boost, etc).
    Et une base incontournable de la plus part des bugs

    Citation Envoyé par camboui Voir le message
    Pour en revenir à mon petit soucis de conception, je pense que la solution de r0d semble la plus élégante.
    Sans boost, c'est surtout la plus simple.

    Citation Envoyé par camboui Voir le message
    Concrêtement je suis en train d'écrire un cache template basique. Lorsque l'on requiert une entrée du cache via une clé on a besoin de savoir si l'entrée est nouvelle ou si elle existe déjà. Il me reste un autre petit soucis, comment faire savoir à l'appelant qu'une entrée du cache va être supprimée (je pense à un callback, un peu comme un prédicat).
    Bizarre. J'aurais tendance à penser que le cache est celui qui sert l'objet, donc il sait s'il peut le fournir tout de suite ou s'il doit aller le chercher. Peux-tu préciser ta conception ?
    [EDIT]: ou au - celui qui sert l'objet a le cache et l'interroge pour savoir s'il contient l'objet, sinon, il va le lire et le rajoute au cache.

Discussions similaires

  1. Foncteur d'additionnement de std::pair
    Par Fr3ak dans le forum C++
    Réponses: 2
    Dernier message: 24/09/2011, 21h17
  2. [C++0x] std::move(), rvalue reference et comparses
    Par Emmanuel Deloget dans le forum C++
    Réponses: 15
    Dernier message: 07/12/2010, 10h04
  3. Défénir un std::map à partir d'un std::pair
    Par mat087 dans le forum SL & STL
    Réponses: 3
    Dernier message: 30/12/2006, 19h36
  4. tri sur std::vector<std::pair<int, float> >
    Par b4u dans le forum SL & STL
    Réponses: 15
    Dernier message: 01/10/2006, 09h19
  5. Equivalent de std::pair mais pour trois valeurs
    Par Rodrigue dans le forum SL & STL
    Réponses: 6
    Dernier message: 26/09/2006, 22h00

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