2009-05-05 3 views

Répondre

5

Je pense que le problème n'est pas avec Boost::Any, mais plutôt avec le fait que vous ne spécifiez pas de comparateur personnalisé. Puisque map est un conteneur associatif trié, vous devez avoir un comparateur.

Les œuvres suivantes pour moi: l'adapter selon vos besoins:

#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; 
} 
+2

Votre foncteur de comparaison n'est pas valide pour une utilisation dans une carte car il peut renvoyer false pour a

+0

Un exemple serait bien. Quoi qu'il en soit, je pense que d'autres cas peuvent être construits là où le comparateur échouera. L'idée même d'avoir une commande à travers les types ne me semble pas bonne. – dirkgently

+0

Un exemple serait n'importe quelle paire où un (a) contient et int et l'autre (b) contient une chaîne. Votre comparateur retournera false pour a

1

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

L'utilisation de visiteurs serait le meilleur moyen de fournir un opérateur de comparaison pour variant s.

Questions connexes