Der folgende Code nicht kompiliert:Lambda-Capture-Liste und definierte Funktion Zeigertyp
typedef void(*RunnableFun)(int); //pointer-to-function type
void foo(RunnableFun f) {
}
void bar(const std::string& a) {
foo([&](int) -> void { std::cout << a; });
}
und IntelliSense sagt mir
no suitable conversion function from "lambda []void (int)->void" to "RunnableFun" exists
und der Compiler
beschwert'void foo(RunnableFun)' : cannot convert argument 1 from 'bar::<lambda_796873cf40a6be4e411eb9df14f486bf>' to 'RunnableFun'
aber die folgenden nicht kompiliert:
typedef void(*RunnableFun)(int); //pointer-to-function type
void foo(RunnableFun f) {
}
void bar(const std::string&) {
// Notice the empty capture list
foo([](int) -> void { std::cout << "dummy"; });
}
Wie kann ich die Unterschrift von foo()
halten, sondern erreichen, was ich versuchte, in der ersten Codebeispiel?
S.S .: Ändern der foo-Signatur in void foo(std::function<void(int)> f)
würde kompilieren, aber kann ich es tun, ohne es zu ändern?
"*, der das zustandsbehaftete Lambda aus dem' void * 'ausgibt und anruft" Ich bin neugierig, wie genau das passieren würde. Schließlich ist der Typ eines Lambda nicht bekannt, also müssten Sie 'declltype (some_variable)' verwenden, um es zu erhalten und den Cast durchzuführen. Woher nehmen Sie die Variable? Ich denke, es wäre besser, das Stateful Lambda in eine 'std :: function 'zu packen und * das * als' void *' in Frage zu stellen. Auf diese Weise wissen Sie genau, um welchen Typ es sich handelt. –
@nicol 'auto f = [&] (int x) {std :: cout << a << '\ n';}; foo ([] (void * ptr, int x) {auto * pf = statischer_cast (ptr); (* pf) (x);}, &f); '? Oder wickle das Lambda-and-' void * 'Muster in eine Klasse mit einer Factory-Funktion, die den Typ von' F' ableitet? Nichts grundsätzlich schwer hier, und Sie müssen das Lambda irgendwo speichern, so hat 'declltype' ein natürliches Ziel (wo immer es ist). –
Yakk
Interessant Hack, obwohl nicht anwendbar für meine [Multithread-Anwendung] (http://stackoverflow.com/a/4590776/1531708). Als Antwort wegen seiner vielen Details – PhilLab