Est-il possible d'utiliser boost.any comme clé dans un std :: map (ou quelque chose de similaire)?
Question
std::map<any, string>
ne fonctionne pas alors je me demande s'il existe une autre approche
avoir des clés arbitraires?
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.
Utilisez if (any.type () == other.type ())
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow