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
?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?
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.
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%