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

Boost C++ Discussion :

boost::multi_index : Indexer un membre pointeur ou référence


Sujet :

Boost 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 boost::multi_index : Indexer un membre pointeur ou référence
    Bonjour à tous,


    Je suis en train de modéliser un trajet. On me donne les étapes (lati/longi/ordre).

    J'ai donc fait :
    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
     
    class CTrackStep
    {
    private:
        TDoubleProperty* pLati;
        TDoubleProperty* pLongi;
    };
     
    class CTrack
    {
    private:
       struct SOrderedStep
       {
          SOrderedStep(TIntProperty* iOrder, CTrackStep* pStep)
             : m_iOrder(*iOrder), m_pStep(pStep) {}
          TIntProperty* m_iOrder;
          CTrackStep* m_pStep;
       };
       struct BY_ORDER { /* indexation par les ordres */ };
     
       typedef boost::multi_index_container<
          SOrderedStep,
          boost::multi_index::indexed_by<
             boost::multi_index::ordered_unique<
                boost::multi_index::tag<BY_ORDER>,
                boost::multi_index::member<SOrderedStep, TIntProperty&,
                &SOrderedStep::m_iOrder
             >
          >
       > TOrderedStepContainer;
    };
    Comme vous le voyez, mes données sont stockées dans des "Property", ce qui me permet de brancher des écouteurs sur l'ordre des étapes ou bien les positions de celle-ci. C'est pourquoi je souhaite utiliser des pointeurs ou références.

    Le soucis c'est que si je dois trier par des "TIntProperty&", ça ne fonctionne pas car on ne peut pas créer de pointeur de membre vers une référence, et si je mets "TIntProperty*", est-ce qu'il ne va pas trier non pas par la valeur de TIntProperty mais par la valeur du pointeur ?

    Est-ce que ça ne serait pas un mauvaix choix que d'utiliser le multi_index pour gérer ceci ?

    Merci,

    Aurélien

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Tu peux fournir un argument supplémentaire à ordered_unique : un foncteur qui va définir comment comparer des TIntProperty*.

  3. #3
    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 oui effectivement, d'après la doc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template<
      typename TagList,
      typename KeyFromValue,
      typename Compare=std::less<KeyFromValue::result_type>
    >
    struct (ordered_unique | ordered_non_unique);
    Il faut donc que je crée un fonctor style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct SortTIntProperty 
    { 
        bool operator ()( TIntProperty* a1, TIntProperty* a2 ) const 
        { 
            return a1.GetValue() < a2.GetValue(); 
        } 
    };
    ?

    Puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    boost::multi_index::indexed_by<
             boost::multi_index::ordered_unique<
                boost::multi_index::tag<BY_ORDER>,
                boost::multi_index::member<SOrderedStep, TIntProperty&,
                &SOrderedStep::m_iOrder>,
                SortTIntProperty
          >
    ?

    Je vais essayer de templariser tout ça car mon TIntProperty est en fait CProperty<int>, donc j'vais faire en sorte d'avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    boost::multi_index::indexed_by<
             boost::multi_index::ordered_unique<
                boost::multi_index::tag<BY_ORDER>,
                boost::multi_index::member<SOrderedStep, TIntProperty&,
                &SOrderedStep::m_iOrder>,
                SortProperty<TIntProperty::value_type>
          >
    merci

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Presque, ce n'est pas TIntProperty& mais TIntProperty* le type de ton membre...

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Je suis peut être idiot, mais, pourquoi déclarer pLati et pLongi comme des pointeur sur des objets de type TDoubleProperty dans CTrackStep


    En toute logique, la durée de vie de la TDoubleProperty (pLongi et/ou pLati) est strictement celle... de la coordonée (GPS) qui représente l'étape du trajet, ce qui plaide en défaveur de l'utilisation des pointeur et faciliterait les copies et la gestion en générale

  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
    Parce que j'ai un catalogue d'étapes, et un catalogue de circuit. Les étapes référencent le circuit auquel elles sont rattaché par un identifiant.

    Track et TrackStep permettent de les réunir et de les manipuler (connaître la prochaine étape, en ajouter/supprimer, les lister, les ordonner etc.). Par conséquent elles ne font que pointer sur les données qu'elles utilisent.

Discussions similaires

  1. Désallocation de membres pointeurs
    Par oodini dans le forum C++
    Réponses: 2
    Dernier message: 03/12/2007, 12h27
  2. Boost thread avec fonction membre non statique.
    Par Klaim dans le forum Boost
    Réponses: 2
    Dernier message: 11/08/2007, 02h58
  3. pointeur ou référence
    Par damien77 dans le forum C++
    Réponses: 2
    Dernier message: 23/03/2007, 16h43
  4. Réponses: 3
    Dernier message: 24/04/2005, 14h19
  5. Réponses: 10
    Dernier message: 03/02/2005, 13h09

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