Seite 1 von 1

[C++] Bedingte std::optional Initialisierung

Verfasst: 23.03.2024, 15:16
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++...

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

Verfasst: 23.03.2024, 17:14
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);

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

Verfasst: 23.03.2024, 19:08
von Jonathan
Huh, ja gut, das war einfach :)

thx!