2017-02-19 4 views
2

Offenbar ist es möglich, bestellt Karten und Sätze von boost::variant, wie diese zu haben:baumartige container von boost :: variant - gibt es irgendwelche nachteile?

typedef boost::variant<std::string, int, bool> key_type; 
std::map<key_type, size_t> m; 

m.insert(std::make_pair(std::string("a"), 3)); 
m.insert(std::make_pair(1, 7)); 
auto x = m.find(1); 
std::cout << x->first << " " << x->second << "\n"; 
x = m.find(std::string("a")); 
std::cout << x->first << " " << x->second << "\n"; 

Ausgang:

1 7 
a 3 

Allerdings finde ich, dass etwas verdächtig; Ich habe in den Quellcode geschaut, um zu sehen, wie das funktionieren kann, aber habe nicht viel daraus gemacht ... irgendwie müssen die verschiedenen Typen mit operator< verglichen werden ... was für 2 Typen definiert werden müsste; Abgesehen davon macht der Vergleich verschiedener Typen mit < für mich keinen Sinn. Daher frage ich mich, ob es einen Haken bei der Verwendung von Karten oder Sets von boost::variant in Bezug auf die Leistung gibt. Gibt es einen Haken? Oder ist es in Ordnung, Karten oder Sätze von boost::variant zu haben?

Antwort

2

fand ich es schließlich in der Dokumentation: http://www.boost.org/doc/libs/1_63_0/doc/html/variant/reference.html

Jede Art als Vorlage Argument Variante mindestens die oben genannten Anforderungen erfüllen muss angegeben. Darüber hinaus sind bestimmte Merkmale der Variante nur verfügbar, wenn seine begrenzten Typen die Anforderungen dieser folgenden zusätzlichen Konzepte erfüllen:

...

LessThanComparable: Variante ist selbst LessThanComparable, wenn und nur wenn jeder von seinen begrenzten Typen erfüllt die Anforderungen des Konzepts.

seit string, int und bool sind alle LessThanComparable dann in diesem Fall der Code sicher und korrekt ist.

Verwandte Themen