2017-08-14 3 views
5

Mit std::variant<int, bool> kann ich std::get<0>(var) anrufen, um den Wert in der Variante zu erhalten, wie es der erste Typ ist - int. Wie kann ich das mit boost::variant tun? boost::get<> scheint nur nach Typ und nicht nach Index zu unterstützen und ich finde die Dokumentation sehr schwer zu verstehen.Item by index von boost :: variant wie es mit std möglich ist :: variant

+0

Sieht aus wie Sie nicht können. –

+0

@BaummitAugen und gibt es eine Möglichkeit, es zu hacken? vielleicht mit ein paar mpl shenanigans? – onqtam

+0

Höchstwahrscheinlich ja. Welcher Standard? –

Antwort

5

Dies scheint im Boost nicht enthalten zu sein.

jedoch mit Hilfe von this answer, können wir einfach unsere eigene Rolle:

template<int N, typename... Ts> using NthTypeOf = 
     typename std::tuple_element<N, std::tuple<Ts...>>::type; 

template<int N, typename... Ts> 
auto &get(boost::variant<Ts...> &v) { 
    using target = NthTypeOf<N, Ts...>; 
    return boost::get<target>(v); 
} 

template<int N, typename... Ts> 
auto &get(const boost::variant<Ts...> &v) { 
    using target = NthTypeOf<N, Ts...>; 
    return boost::get<target>(v); 
} 

int main() { 
    boost::variant<int, double> v = 3.2; 
    std::cout << get<1>(v); 
} 

anzeigen live.

Die Zeigerüberladungen können natürlich auf Wunsch analog hinzugefügt werden.

+1

yeah mein Schlechter - die Const-Ness wurde richtig propagiert, nur mit Auto. Danke für die Antwort! IMHO muss dies zu '' 'boost :: variant''' hinzugefügt werden ... – onqtam

+0

@onqtam Ich habe noch nie versucht einen Beitrag zu leisten, aber ich schätze, du könntest einen Patch einreichen. Ich verstehe nicht, warum sie dagegen sein würden. (Nicht sicher, welchen Standard sie verwenden, in C++ 11 wird das schon etwas hässlicher und ich bin nicht sicher, wie es in C++ 03 geht.) –

+0

@onqtam es ist meine feste Ansicht, dass der Zugriff nach Index erfolgt , wenn Sie Zugriff nach Typ verfügbar haben, ist ein völliges Anti-Muster. –

Verwandte Themen