Est-il possible d'utiliser boost.any comme clé dans un std :: map (ou quelque chose de similaire)?

StackOverflow https://stackoverflow.com/questions/823971

  •  05-07-2019
  •  | 
  •  

Question

std::map<any, string> ne fonctionne pas alors je me demande s'il existe une autre approche avoir des clés arbitraires?

Était-ce utile?

La solution

Je pense que le problème ne vient pas de Boost::Any, mais plutôt du fait que vous ne spécifiez pas de comparateur personnalisé. Étant donné que map est un conteneur associatif trié, vous devez disposer d'un comparateur.

Ce qui suit fonctionne pour moi: adaptez-le à vos objectifs:

#include <iostream>
#include <map>
#include <boost/any.hpp>

using namespace std;    
struct cmp {
    bool operator()(const boost::any& l, const boost::any& r) {
        try
        {
            int left = boost::any_cast<int>(l);
            int right = boost::any_cast<int>(r);
            return left < right;
        }
        catch(const boost::bad_any_cast &)
        {
            return false;
        }

        return false;
    }
};
int main() {   
    map<boost::any, string, cmp> ma;
     boost::any to_append = 42;
     ma.insert(std::make_pair(to_append, "int"));
    if (ma.find(42) != ma.end()) {
        cout << "hurray!\n";
    }
    return 0;
}

Autres conseils

Vous voudrez peut-être regarder boost::variant plutôt que boost::any pour être sûr que tous les types que vous utilisez sont comparables.

Le meilleur moyen de fournir un opérateur de comparaison pour variant s.

est l’utilisation de visiteurs.

Utilisez if (any.type () == other.type ())

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top