[C++] Bedingte std::optional Initialisierung

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Jonathan
Establishment
Beiträge: 2542
Registriert: 04.08.2004, 20:06
Kontaktdaten:

[C++] Bedingte std::optional Initialisierung

Beitrag von Jonathan »

Moin,

ich habe ein std::optional<RandomSound> sound; Objekt, dass ich in meinem Konstruktor initialisieren möchte. RandomSound erfordert zwingend Konstruktorparameter, kann also nicht leer sein, daher der optional-Wrapper. RandomSound hat darüber hinaus auch keinen Zuweisungsoperator. Also muss ich das Objekt direkt im Konstruktor initialisieren:

sound( should_load_sound ? {filename} : std::nullopt),

Das geht nicht, weil beim tenären Operator wohl beide Pfade den selben Typen haben müssen, d.h. es können wohl nicht unterschiedliche optional-Konstruktoren aufgerufen werden.

Siehe dazu auch: https://giodicanio.com/2024/01/12/subtl ... -operator/

Wars das jetzt also für mich, solange sich das RandomSound Interface nicht verändert? Die naheliegende Lösung ist natürlich einfach zu einem unique_ptr zu wechseln, aber dann hab ich halt immer eine zusätzlich Indirektion, ist also weniger effizient. Finde ich gerade ein bisschen blöde von C++...
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Schrompf
Moderator
Beiträge: 5040
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: [C++] Bedingte std::optional Initialisierung

Beitrag von Schrompf »

Hö? Default-konstruiere den Sound, und wenn's dann soweit ist, konstruierst Du mit emplace() das Objekt im optional

Code: Alles auswählen

std::optional<Sound> sound{};
...

...

sound.emplace(filename);
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Jonathan
Establishment
Beiträge: 2542
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: [C++] Bedingte std::optional Initialisierung

Beitrag von Jonathan »

Huh, ja gut, das war einfach :)

thx!
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Antworten