C++ - lambda - capture-member-variable
Ich habe eine Klasse, die Funktion Zeiger auf kernel-Funktion, die das ändern können von außerhalb.
class Bar
{
public:
int i;
}
class Foo
{
public:
std::function<double()> kernel;
Bar bar;
};
int main()
{
Foo f;
f.kernel = []() -> double { return i * i; }; //this is not working obviously
}
Wie kann ich erreichen, das Verhalten ist "vorgestellt", wie zB. Lesen Sie der Klasse Variablen innerhalb der lambda. Ich kann es umgehen, indem übergeben f
im inneren und schreiben f.bar.i
, das ist aber keine sehr schöne Lösung.
- Was ist falsch mit
[&f]() { return f.i * f.i; }
? - Ich habe die Frage bearbeitet
- Also Sie wollen im Grunde zu nennen
f.kernel()
undkernel
sollten automatisch verbunden werdenf
wie es war, eine member-Funktion? - ja.. im Grunde das ist, was ich will
- Warum ist es nicht einfach eine member-Funktion dann?
- Ich muss dynamicly ändern Sie die Funktion von außen
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C++14 Sie können schreiben Sie es so,
Wenn Sie nicht über C++14, können Sie alternativ erstellen Sie eine weitere variable,
Obwohl es ist nichts falsch mit der übergabe
f
und schreibenf.bar.i
.f
, nicht wahr? Also wenn ichf2.kernel = f.kernel
- und call -f2.kernel()
bekomme ich diei
ausf
? Könnte nicht ein problem sein, obwohl.warning: lambda capture initializers only available with -std=c++14 or -std=gnu++14
so ist es eine C++ - Funktion 14kernel
ausf
zuf2
dann wären Sie mit der gleichen Funktion, wenn Sie es aufrufen, die entweder die Instanz.Scheint es, dass Sie können nicht so tun,.
Es ist kein Konstrukt zu schaffen, einen member-Funktion lambda.
Wohl aber Folgen Sie @KerrekSB Vorschlag, zusätzlich zu, dass die Versendung der Aufruf von bekommen noch die member-Funktion:
Beachten Sie, dass Sie nicht nennen kann beide Felder
kernel
._kernel
statisch, so dass alle Instanzen teilen sich die gleiche "member-Funktion".Der lambda-Funktion nicht kennen ich oder Bar. Wie konnte Sie es wissen? Sie müssen übergeben Sie einen Verweis. Wenn Sie die Definition der Funktion Körper anders, so dass Sie übergeben können, die ich als parameter und rufen Sie es innerhalb der Klasse sollten Sie bekommen, was Sie wollen.