std::map<any, string>
funktioniert nicht, also frage ich mich, ob es eine andere Herangehensweise an Arbritary-Schlüssel haben?Ist es möglich, boost.any als Schlüssel in einer std :: map (oder ähnlichem) zu verwenden?
Antwort
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;
}
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
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
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
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.
- 1. Ist es möglich, eine benutzerdefinierte Klasse anstelle von std :: pair in einer STL-Map zu verwenden?
- 2. Referenz als Schlüssel in std :: map
- 3. Verwendung von Vorlagen als Schlüssel in einer std :: map
- 4. Möglich std :: map als rvalue zu erstellen?
- 5. Verwenden von char * als Schlüssel in std :: map
- 6. Mit char * als Schlüssel in std :: map, wie funktioniert es
- 7. Den nächsten oder genauen Schlüssel in einer std :: map finden
- 8. Ist es möglich, std :: accumulate mit std :: min zu verwenden?
- 9. Letzter Schlüssel in einer std :: map
- 10. Was ist der beste Weg, um zwei Schlüssel mit einer std :: map zu verwenden?
- 11. Wie ist std :: langsamer als std :: map?
- 12. Verwenden von Std Shared_ptr als Std :: Map Key
- 13. Ist es möglich, std :: make_unique in Xcode 5.1 zu verwenden?
- 14. Ist es möglich, std :: string in einem conexpr zu verwenden?
- 15. Ist es möglich, "man std :: find" in Linux zu verwenden?
- 16. Ist es möglich, eine std :: string für read() zu verwenden?
- 17. Ist es möglich, eine std :: map mit n Schlüsseln zu initialisieren, wobei n vordefiniert ist?
- 18. einschließlich einer std :: map innerhalb einer Struktur? Ist es o.k?
- 19. Ist es möglich, Freiformformen als Fenster in OSX zu verwenden?
- 20. Wie bekomme ich einen std :: Schlüsselsatz zu einer std :: map?
- 21. Ist es möglich, Datensatznamen als Parameter in Erlang zu verwenden
- 22. Parameter zu verwenden std :: größer oder std :: less als Argument
- 23. Ist es möglich, einen Bereich als Schlüssel für einen Hash in Ruby zu verwenden?
- 24. Ist es möglich, `std :: make_shared` zu zwingen, den neuen Operator einer Klasse zu verwenden?
- 25. C++ - std :: wstring zu std :: string - schnelle und dreckige Konvertierung für den Einsatz als Schlüssel in std :: map
- 26. Verwenden von DOM-Elementen als Schlüssel zu JavaScript-Map
- 27. Ist es möglich, einen Datensatz als Datensatzelement zu verwenden?
- 28. Ist es möglich, Variablen als dom-Elemente zu verwenden?
- 29. Ist es möglich, ReSharper NUR als Test Runner zu verwenden?
- 30. Ist es möglich, Variable als @JsonRootName zu verwenden?
Was möchten Sie tun? – Skurmedel
Wo ist der Any Key? – Artelius
Wie kann ich Vorlagenparameter im Stackoverflow posten? – DaVinci