Was sind die Unterschiede zwischen std::variant und boost::variant?

Lesezeit: 5 Minuten

Was sind die Unterschiede zwischen stdvariant und boostvariant
einsprechen

In einer Antwort auf diese SO-Frage:

Was ist das Äquivalent von boost::variant in der C++-Standardbibliothek?

es wird erwähnt, dass boost::variant und std::variant etwas abweichen.

  • Was sind die Unterschiede für jemanden, der diese Klassen verwendet?
  • Welche Motivation hat das Komitee zum Ausdruck gebracht? std::variant mit diesen Unterschieden?
  • Was muss ich beim Codieren mit einem dieser beiden beachten, um die maximale Kompatibilität mit dem Wechsel zu dem anderen zu gewährleisten?

(die Motivation nutzt boost::variant im Code vor C++17)

  • @JohnZwinck: Würde mich über Ihren Kommentar/Ihre Antwort freuen, wenn Sie sehen, wie Sie die von mir verlinkte Antwort geschrieben haben.

    – einbinden

    23. Okt ’16 um 9:20

  • Ich denke, JohnZwinck wird nicht benachrichtigt, es sei denn, er hat mit dieser Frage interagiert. Sie können stattdessen seine Antwort auf die andere Frage kommentieren, um seine Aufmerksamkeit zu erregen.

    – DavidW

    23. Okt ’16 um 9:43

  • Für diejenigen, die sich nicht bewusst sind, boost::variant und boost::variant2 sind zwei verschiedene Bibliotheken. Die Frage bezieht sich auf ersteres, aber es scheint erwähnenswert zu sein, dass die offizielle Dokumentation von boost::variant2 gibt an, dass es API-kompatibel ist mit std::variant, mit einigen Vorbehalten: boost.org/doc/libs/1_75_0/libs/variant2/doc/html/… . Siehe auch die Boost-Projektliste unter boost.org/doc/libs/1_75_0

    – Max Barraclough

    7. März ’21 um 18:23

  • @MaxBarraclough: Siehe Bearbeiten und auch diese neue Frage.

    – einbinden

    7. März ’21 um 23:42

Was sind die Unterschiede zwischen stdvariant und boostvariant
Nicol Bolas

  • Einsatz-/Stellungsverhalten:

    • boost::variant kann Speicher zuweisen, wenn Zuweisungen durchgeführt werden in ein Leben variant. Es gibt eine Reihe von Regeln, die regeln, wann dies passieren kann, also ob a boost::variant wird Speicher zuweisen, hängt von der Ts es wird mit instanziiert.

    • std::variant Wille noch nie Speicher dynamisch zuweisen. Als Zugeständnis an die komplexen Regeln von C++-Objekten jedoch, wenn eine Zuweisung/Einlagerung wirft, dann variant kann in den Zustand “valueless_by_Exception” eintreten. In diesem Zustand ist die variant können nicht besucht werden, noch funktionieren alle anderen Funktionen zum Aufrufen eines bestimmten Mitglieds.

      Sie können diesen Zustand nur betreten, wenn Zuweisung/Stellung geworfen wird.

  • Boost.Variante beinhaltet recursive_variant, die erlaubt ein variant sich selbst enthalten. Sie sind im Wesentlichen spezielle Wrapper um einen Zeiger auf a boost::variant, aber sie sind in die Besuchsmaschinerie eingebunden.

    std::variant hat keinen solchen Helfertyp.

  • std::variant bietet mehr Verwendung von Post-C++11-Funktionen. Beispielsweise:

  • Ist es möglich, diese Art von Rekursivitätsfunktionalität hinzuzufügen? std::variant ohne die Klasse zu ändern? (Aber vielleicht mit dem Hinzufügen von Sachen zu namespace std?)

    – einbinden

    1. Dez. ’17 um 21:05

  • @einpoklum: Der Sinn von recursive_variant ist, dass es erlaubt visit um das Objekt, auf das es verweist, automatisch zu entpacken und zu besuchen. Daher müsstest du diese Maschinerie einbauen in std::visit. Ohne geht’s nicht ersetzen std::visit, was Sie nicht tun können. Natürlich können Sie jederzeit Ihre eigene Version von erstellen std::visit in Ihrem eigenen Namensraum, der das Entpacken/Besuchen übernimmt.

    – Nicol Bolas

    1. Dez. ’17 um 21:07


  • Ich frage mich, ob es in Erwägung gezogen wird, die hinzuzufügen recursive_variant zum std Version … zumindest jetzt, wo ich Varianten stark verwende, scheint es, als ob die Möglichkeit, sie rekursiv zu machen, einen Großteil ihrer Macht darstellt.

    – Dan Nissenbaum

    1. Dez. ’17 um 21:38

  • @DanNissenbaum: Zu diesem Zweck wurden keine Vorschläge gemacht. Jedoch, N4450 (pdf) zeigt, dass der Ausschuss nicht besonders freundlich dazu stand. Davon abgesehen ist es jetzt, da es im Standard enthalten ist, etwas, das überarbeitet werden könnte. Etwas, worüber der Ausschuss jedoch möglicherweise besser nachdenken könnte, ist ein allgemeiner Mechanismus, der die Anpassung von . ermöglicht std::visit benutzen. Damit du deine eigenen schreiben kannst variant die diese Maschinerie benutzen und Ihre eigenen rekursiven Besuche machen.

    – Nicol Bolas

    1. Dez. ’17 um 22:08


  • NicolBolas und wer auch immer dies liest – die Abstimmung des Ausschusses über rekursive Varianten war 8 neutral, 4 schwach dagegen, 2 stark dagegen. Und – die Frage war “benötigt?” statt “erwünscht?” oder “nützlich?”. In der Tat, wie Nicol vorschlägt, mit mehr Menschen, die std::variant das könnte sich ändern. @DanNissenbaum: Sie könnten dies in der Standard-Mailingliste erwähnen (wenn Sie nicht einmal einen tatsächlichen Vorschlag schreiben).

    – einbinden

    1. Dez. ’17 um 23:52


Was sind die Unterschiede zwischen stdvariant und boostvariant
einsprechen

Es scheint der Hauptstreitpunkt bezüglich des Designs einer Variantenklasse gewesen zu sein, was passieren sollte, wenn eine Zuweisung an die Variante, die nach Abschluss den alten Wert zerstören sollte, eine Ausnahme auslöst:

variant<std::string, MyClassWithThrowingDefaultCtor> v = "ABC";
v = MyClassWithThrowingDefaultCtor();

Die Optionen scheinen zu sein:

  • Verhindern Sie dies, indem Sie die möglichen darstellbaren Typen auf nichtthrow-move-konstruierbare beschränken.
  • Behalten Sie den alten Wert bei – dies erfordert jedoch Doppelpuffer.
  • Konstruieren Sie den neuen Wert auf dem Heap, speichern Sie einen Zeiger darauf in der Variante (damit die Variante selbst auch bei einer Ausnahme nicht verstümmelt wird). Das ist anscheinend was boost::variant tut.
  • Verschaffen Sie sich für jede Variante einen ‘deaktivierten’ Zustand ohne Wert und gehen Sie bei solchen Fehlern in diesen Zustand über.
  • Undefiniertes Verhalten
  • Lassen Sie die Variante werfen, wenn Sie versuchen, ihren Wert zu lesen, nachdem so etwas passiert ist

und wenn ich mich nicht irre, wird letzteres akzeptiert.

Dies ist aus dem ISO C++-Blog zusammengefasst Post von Axel Naumann vom Nov 2015.

1641850857 821 Was sind die Unterschiede zwischen stdvariant und boostvariant
Sonne1211

std::variant unterscheidet sich geringfügig von boost::variant

  • std::variant wird in der Header-Datei deklariert und nicht in
  • std::variant weist niemals Speicher zu
  • std::variant ist verwendbar mit constexpr
  • Anstatt boost::get(&variable) zu schreiben, müssen Sie std::get_if(&variable) für std::variant schreiben
  • std::variant kann sich nicht rekursiv halten und verfehlt einige andere fortgeschrittene Techniken
  • std::variant kann direkt Objekte konstruieren
  • std::variant hat index() anstelle von which()

  • Boost.Variant ist nicht Teil des C++-Standards.

    – einbinden

    27. Juni ’21 um 18:27

.

336890cookie-checkWas sind die Unterschiede zwischen std::variant und boost::variant?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy