Comment comparer boost :: variant pour en faire une clé de std :: map? Il semble que l'opérateur <() n'est pas défini pour boost :: variantComment comparer boost :: variant afin d'en faire une clé de std :: map?
3
A
Répondre
1
Peut-être que vous pouvez passer un comparateur à la carte. S'il vous plaît voir http://www.sgi.com/tech/stl/Map.html pour un exemple sur la façon d'écrire un comparateur.
5
ÉDITÉ pour corriger une erreur BOOST :: APPLY_VISITOR APPLIQUANT
Vous pouvez créer un visiteur binaire pour votre variante, et ensuite utiliser boost :: apply_visitor pour créer un comparateur pour votre carte:
class variant_less_than
: public boost::static_visitor<bool>
{
public:
template <typename T, typename U>
bool operator()(const T & lhs, const U & rhs) const
{
// compare different types
}
template <typename T>
bool operator()(const T & lhs, const T & rhs) const
{
// compare types that are the same
}
};
Vous devrez probablement surcharger operator()
pour chaque paire de types possible, comme indiqué dans l'utilisation du modèle operator(const T &, const U &)
. Ensuite, vous aurez besoin de déclarer votre carte comme ceci:
class real_less_than
{
public:
template<typename T>
bool operator()(const T &lhs, const T &rhs)
{
return boost::apply_visitor(variant_less_than(), lhs, rhs);
}
};
std::map<boost::variant<T, U, V>, ValueType, real_less_than> myMap;
Edit: pour ce que ça vaut, operator<()
est défini pour boost::variant
mais il est défini comme:
bool operator<(const variant &rhs) const
{
if(which() == rhs.which())
// compare contents
else
return which() < rhs.which();
}
que je suppose est pas ce que tu veux.
Questions connexes
- 1. Iterate std :: list <boost :: variant>
- 2. Boost Clé composite personnalisée Multi-Index Comparer
- 3. Dernière clé d'un fichier std :: map
- 4. Problème avec boost :: variant, linker donnant une erreur de segmentation
- 5. Comment vérifier si std :: map contient une clé sans faire d'insertion?
- 6. Est-il possible d'utiliser boost :: foreach avec std :: map?
- 7. Boost.Bind pour accéder aux éléments std :: map dans std :: for_each
- 8. Comment insérer dans std :: map?
- 9. Pourquoi l'exemple boost :: variant ne fonctionne-t-il pas?
- 10. convertir génériquement de boost :: variant <T> en type
- 11. std :: map valeur par défaut
- 12. Le type le plus rapide pour la clé std :: map?
- 13. Valeur suivante dans std :: map
- 14. Passer un boost :: unordered_set comme résultat map to boost :: split
- 15. Comment itérer sur des valeurs std :: map modifiées?
- 16. C++ Comment trouver la plus grosse clé dans une carte std :: map?
- 17. Métaprogrammation de template C++ pour créer un boost :: variant d'un shared_ptr et d'un boost :: static_visitor
- 18. Persistance de std :: map en C++
- 19. Exigences de type pour std :: map
- 20. Comment utiliser boost :: mpl :: fold avec boost :: fusion :: map?
- 21. Erreur d'exécution std :: map inhabituelle
- 22. référentiel de données basé sur std :: map et boost :: any: erreurs de conversion
- 23. boost :: variante <T> à std :: string
- 24. Boost :: bind et std :: copy
- 25. Est-il prudent de sérialiser un boost :: variant brut?
- 26. Version C de C++ std :: map
- 27. Comment puis-je utiliser boost :: thread :: id comme clé d'unordord_map?
- 28. std :: map des pointeurs de fonction membre?
- 29. accès rapide à l'élément de std :: map
- 30. Portage de std :: map vers C?
oh, merci. L'opérateur <() ne fonctionnait pas pour ma variante car il est défini avec boost :: make_recursive_variant <>, pas avec boost :: variable <> Je vais copier le code du boost normal :: variant <> – user222202
@ user222202 - voir ma rédaction. Vous ne pouvez pas appeler boost :: apply_visitor dans la liste des modèles pour map. Vous allez devoir créer un objet fonction qui applique le visiteur. –