Sie müssen eine Karte verwenden. Wenn Sie daran anders denken, was Sie wirklich wollen, ist ein std::unordered_map<Type, Object>
(d. H. Die Schlüssel sind Typen und die Werte sind, na ja, Werte). Stattdessen verwenden Sie std::unordered_set<Object>
, wobei die Schlüssel die gleichen wie die Werte sind.
Anstatt also sollten Sie
auto myMap = hana::make_map(
hana::make_pair(hana::type_c<int>, 2),
hana::make_pair(hana::type_c<char const*>, "hi"),
hana::make_pair(hana::type_c<double>, 3.0)
);
std::cout << myMap[hana::type_c<char const*>] << std::endl;
Ansonsten schreiben Sie auch einen Satz verwenden können und dann Element finden darin hana::find_if
mit einem Prädikat verwendet, die die Art des Objekts überprüfen würde. Dies wird jedoch weniger effizient für die Kompilierung sein, da hana::find_if
eine lineare Suche durchführen muss.
Als eine Randnotiz der obigen Argumentation ist, dass 'hana :: set' immer nur nützlich ist, um Objekte zu halten, die zur Kompilierungszeit verglichen werden können, da diese Objekte als Schlüssel verwendet werden. Im Grunde ist 'hana :: set' fast nutzlos für irgendwas Runtime, während' hana :: map' immer noch sinnvolle Laufzeitwerte enthalten kann, solange die Schlüssel kompiliert werden. –
Ich konnte 'hana :: set' mit Laufzeitwerten verwenden, wenn alle Typen eindeutig waren und' hana :: Comparable'. In einigen Fällen könnte es effizienter sein als eine Karte, weil es keine Paare bilden würde, und die Symbollänge könnte wahrscheinlich viel kürzer sein. –
Was würde 'hana :: find' zurückgeben? Es muss ein 'hana :: optional' zurückgegeben werden, dessen optionale-ness zur Kompilierzeit bekannt sein muss. Daher müssen die Schlüssel __at compile-time__ vergleichbar sein. Beachten Sie, dass das gleiche gilt für "hana :: tuple", aber mindestens "hana :: tuple" kann auch über Indizes aufgerufen werden, so dass es sinnvoll ist, Laufzeitwerte in einem Tupel zu haben. –