2017-07-08 2 views
1

Ich versuche, einen neuen Konstruktor eine vorhandene Klasse hinzuzufügen und frage mich, ob ich irgendwie eine emplace Initialisierung einer optional machen kann und dann diesen Wert im Initialisierer für einen anderen Mitgliedswert verwenden.Kann ich optional :: emplace als Memberinitialisierer aufrufen?

Zum Beispiel:

class sample { 
    my_type sc; 
    optional<opt_type> run; 

    sample() : 
     sc(gen_default()) { 
    } 

    enum ctor_alt { ctor_alt }; 
    sample(ctor_alt) : 
     emplace(run, ctor_arg), /* Possible somehow? */ 
     sc(run.field) { 
    } 

Meine primäre Motivation ist, dass ich will nicht die Art von my_type verändern. Es gibt viele Benutzer dieser Variablen und wenn Sie sie in einen Wrapper einfügen, müssen Sie viel Code ändern.

Antwort

3

Klar doch, rufen Sie einfach die constructor of std::optional mit std::in_place_t:

run{std::in_place, ctor_arg} 

std::in_place_t ein Tag-Typ ist eindeutig zu machen, wenn Sie die Art wollen den Wert an seinem Platz zu bauen, anstatt sie zu kopieren.

Wenn Sie den Wert des optionalen für eine andere Elementvariable verwenden möchten, müssen Sie sicherstellen, dass die Elementvariable nach dem optionalen kommt, da Mitgliedsobjekte in der Reihenfolge, in der sie angezeigt werden, initialisiert werden.

5

emplace ist eine Elementfunktion, und Sie können eine Elementfunktion erst ausführen, wenn Sie das Objekt erstellt haben (es sei denn, Sie sind der Konstruktor des Objekts). Aber wenn Sie ein Eingriff optional<T> an Ort und Stelle bauen möchten, können Sie einfach den Konstruktor:

run(std::in_place, ctor_arg) 

jedoch Mitglied initializers werden immer in der Reihenfolge ausgeführt, in dem die Mitglieder deklariert sind, nicht die Reihenfolge in der Member-Initialisierungsliste (Ihr Compiler sollte Sie warnen, wenn Sie sie außer Betrieb initialisieren). Wenn Sie also einen früheren Initialisierer verwenden möchten, um eine spätere Variable zu initialisieren, müssen Sie sie in Ihren Deklarationen korrekt bestellen:

optional<opt_type> run; 
my_type sc; 
Verwandte Themen