Erfassen Sie std :: promise in einem Lambda C ++ 14

8

Ich möchte eine Zustandsmaschine machen, die die übertragenen Signale in einem eigenen Thread bearbeitet. Ich benutze Visual Studio 2015, also C ++ 11 und teilweise C ++ 14 wird unterstützt. Signale werden in Containern gespeichert. Jedes Signal wird als eine std :: -Funktion dargestellt. Ich würde gerne vom Client warten, bis die Zustandsmaschine das übertragene Signal verarbeitet, also ist es eine Art synchrones Signal.

Mein Problem ist: Ich kann kein std :: promise in ein Lambda aufnehmen und es dem Container hinzufügen.

%Vor%

Was sind die Lösungen wenn

?
  • Ich möchte vermeiden, das Versprechen durch Bezugnahme einzufangen
  • Ich möchte vermeiden, einen * Zeiger oder ein shared_ptr zu dem Versprechen
  • zu erfassen

Es wäre schön, das Versprechen irgendwie in die Klasse einzubetten, dass das Lambda erzeugt. Das bedeutet, dass das Lambda nicht mehr kopierbar, nur noch beweglich ist. Ist das überhaupt möglich?

    
user2281723 30.10.2015, 12:46
quelle

2 Antworten

10

std::function kann nur aus Funktoren erstellt werden, die kopierbar sind. Von [func.wrap.func.con]:

%Vor%      

Benötigt : F soll CopyConstructible sein.

std::promise ist nicht kopierbar, daher gibt es keine Möglichkeit, einen Funktor mit diesem Mitglied in einem std::function zu kleben. Zeitraum.

Wenn Sie möchten, dass Ihr Funktor tatsächlich das Versprechen übernimmt, bleiben Ihnen nicht viele Optionen. Ziemlich viel std::shared_ptr<std::promise> . Jede andere Option funktioniert entweder nicht (z. B. " std::unique_ptr<std::promise> "), lässt Sie ein freies Objekt (z. B. " std::reference_wrapper<std::promise> ") oder Probleme mit der Speicherverwaltung (z. B. " std::promise* ").

Sie könnten jedoch etwas anderes als std::function verwenden. Sie können sich Yakks task idea hier ansehen, sowie dyp 's function_mo hier , beide die bewegliche Aromen von std::function erstellen.

    
Barry 30.10.2015, 13:20
quelle
2

Es ist trivial, eine eigene polymorphe Funktionsklasse zu erstellen. Dieses Beispiel behebt das Argument und die Rückgabetypen, aber ein wenig mehr Arbeit könnte sie bei Bedarf templatisieren.

%Vor%

erwartete Ausgabe:

%Vor%     
Richard Hodges 30.10.2015 14:01
quelle

Tags und Links