6
votes

Boost Multi-Index Conteneur avec indice basé sur des valeurs imbriquées

Si j'ai un objet comme celui-ci:

struct Foo {
   Bar const& bar();
};


0 commentaires

3 Réponses :


5
votes

Je pense que vous devez créer un objet de prédicat qui prend deux instances de FOO et son opérateur () peut appeler FOO :: bar () sur les deux instances.

Quelque chose comme p> xxx Pré>

Utilisez P>

...
boost::multi_index::ordered_unique<boost::multi_index::tag<tag_prop>, 
    boost::multi_index::identity<Foo>, MyPredicate>,
...


0 commentaires

1
votes

Autant que j'aime utiliser Lambdas pour faire des choses simples, cela peut rapidement dégénérer :)

Dans votre cas, car il est un peu plus compliqué, je vous fierais soit sur une fonction libre ou un comparateur de prédicat. p>

Le prédicat présente l'avantage de définir des types plus clairement, il est généralement plus facile de l'apporter en réalité. p>

aussi, pour l'amour de la lisibilité, j'ai généralement typé de mon index, qui donne: P >

namespace mi = boost::multi_index;

struct FooComparator
{
  bool operator()(Foo const& lhs, Foo const& rhs) const
  {
    return lhs.bar().property() < rhs.bar().property();
  }
};

typedef mi::ordered_unique <
          mi::tag<tag_prop>,
          mi::identity<Foo>,
          FooComparator
        > foo_bar_index_t;

typedef boost::multi_index_container <
          Foo,
          mi::indexed_by < 
            foo_bar_index_t,
            // ... other indexes
          >
        > foo_container_t;


1 commentaires

D'accord. J'utilise généralement des alias Typefs et des espaces de noms également, mais cela semblait trop compliqué pour cet exemple trivial, alors je les ai effondrée à une seule déclaration.



6
votes

Plutôt que de fournir un comparateur défini par l'utilisateur, vous pouvez écrire un extracteur de clé défini par l'utilisateur : xxx

voir Caractéristiques avancées des extracteurs de touches Boost.MultiIndex


0 commentaires