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
Antwort
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.
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
@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.) –
@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. –
- 1. boost :: variant Konvertierung eingeben
- 2. boost :: variant und Funktionsüberladungsauflösung
- 3. baumartige container von boost :: variant - gibt es irgendwelche nachteile?
- 4. Verwenden von std :: variant in g ++
- 5. swifty objective-C++ mit std :: variant
- 6. boost :: variant und Polymorphismus in C++ 11
- 7. Wie VARIANT konvertieren integer
- 8. Wie mache ich eine vereinfachte Version von boost :: variant?
- 9. Wie man boost :: variant vergleicht, um es zu einem Schlüssel von std :: map zu machen?
- 10. Variant visitation und common_type
- 11. redundanten Code in boost :: variant Besucher zu vermeiden
- 12. Using boost :: variant und bekommen einen generischen Rückgabetyp
- 13. zu Variant kurz Konvertieren (extrahieren Variant von kurz)
- 14. Was ist boost :: variant speicher und leistung kosten?
- 15. boost :: variant Besucherrückgabe Fehler (am meisten ärgerlichen Parse?)
- 16. Wie man heterogene std :: map mit boost :: variant in "zweidimensionaler Weise" definiert
- 17. Kann std :: variant mit verschiedenen Lambda-Ausdrücken nicht initialisieren
- 18. Variant Generische Schnittstellen
- 19. Mit std :: vector <boost :: variant <...>> mit Google Mock verursacht einen Kompilierungsfehler
- 20. einen neuen Schub-Variant-Typ aus gegebenen verschachtelten Boost-Variantentyp
- 21. Variant-Databibliothek für C
- 22. Wie wird in diesem Beispiel std :: variant wertlos_bis_exception?
- 23. std :: set gefüllt mit boost :: variant Elemente können nicht absteigend sortiert werden?
- 24. boost :: variant - warum wird "const char *" in "bool" umgewandelt?
- 25. Würde eine Vorlage für den Besuch von std :: variant funktionieren?
- 26. Variant Typ in C#
- 27. Wie schreibe ich Operator << für std :: variant?
- 28. Ungültiger Variant-Betriebsfehler
- 29. Create Variant from FILETIME
- 30. VBA Variant Überlauf
Sieht aus wie Sie nicht können. –
@BaummitAugen und gibt es eine Möglichkeit, es zu hacken? vielleicht mit ein paar mpl shenanigans? – onqtam
Höchstwahrscheinlich ja. Welcher Standard? –