2016-03-22 15 views
1

Ich habe den folgenden Code:Suchen Sie nach einem Wert innerhalb eines Satzes

auto mySet = hana::make_set(2, "hi", 3.0); 

Wie bekomme ich den Wert um einen bestimmten Typ ?:

std::cout << mySet[???] << std::endl; 

Like 'MYSET [char *]' oder etwas. Arbeitet das dafür, oder muss ich eine Karte benutzen?

Antwort

2

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.

+1

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. –

+0

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. –

+0

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. –

Verwandte Themen