2009-05-05 9 views

Antwort

5

Ich denke, das Problem ist nicht mit Boost::Any, sondern eher mit der Tatsache, dass Sie keinen benutzerdefinierten Komparator angeben. Da map ein sortierter assoziativer Container ist, benötigen Sie einen Komparator.

Die folgenden Werke für mich: Schneider es nach Ihren Zwecken:

#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

Ihr Vergleichsfunktor ist für die Verwendung in einer Map nicht gültig, da er sowohl für a (a, b) als auch für a

+0

Ein Beispiel wäre nett. Jedenfalls denke ich, dass mehr solche Fälle konstruiert werden können, wo der Komparator versagt. Die Idee einer Ordnung über Typen hinweg klingt mir nicht gut. – dirkgently

+0

Ein Beispiel wäre ein beliebiges Paar, bei dem eins (a) int enthält und das andere (b) eine Zeichenfolge enthält. Ihr Komparator würde false für a

1

Sie könnten boost::variant eher aussehen wollen als boost::any, so dass Sie alle sicher sein können, Typen, die Sie verwenden, vergleichbar sind.

Die Verwendung von Besuchern wäre der beste Weg, einen Vergleichsoperator für variant s zur Verfügung zu stellen.

Verwandte Themen