Anonyme Funktion C++

Ich versuche, verwenden Sie die Funktion signal(int,void(*)(int)) aus <csignal> zu handhaben, die SIGFPE floating point exception. Ich möchte in der Lage sein zu drucken einige nützliche Diagnose-neben nur die Meldung "Gleitkomma-Ausnahme" oder etwas zu dieser Wirkung. Dies bedeutet, dass die Funktion, die ich übergeben, als die handler zu signal benötigt Zugriff auf einige der Daten in meinem code. Darin liegt das Problem.

Muss die Funktion zurück void und akzeptiert nur 1 parameter vom Typ int. Ich kann den handler eine member-Funktion von mein Daten Speicher-Klasse, da dann der Typ wäre void(Foo::*)(int) durch die versteckte this Zeiger.

Ich dachte über die Verwendung von Lambda-Ausdrücke, um zu versuchen und machen Sie eine anonyme Funktion wie folgt;

void handler(int nSig, Foo data)
{
    //do something
}
//snip
Foo data;
signal(SIGFPE, [&](int nSig)->void{handler(nSig,data);});

jedoch, da der lambda-Ausdruck erfasst die variable data von außerhalb der compiler wird nicht lassen Sie es sein, die cast auf einen Zeiger auf void(*)(int) (was schade ist, da dies scheint, wie ein ideal zu verwenden für Lambda-Ausdrücke).

Konnte ich einfach machen data eine Globale variable, die könnte dann gesehen werden, in handler aber ich bin nicht Willens, dies zu tun, aus offensichtlichen Gründen.

Also meine Frage ist also; was ist der beste Weg zur Nachahmung der anonyme Funktionen in C++?

Hinweis: ich würde lieber eine native C++ - Lösung und nicht zu haben, um boost oder gleichwertig.

  • Was meinst du können Sie nicht wirken data zu einem void(*)(int)? data ist eine Instanz von Foo... Wieso kann man das nicht nennen data.handler(nSig)?
  • Wenn ich handler Mitglied der Klasse Foo dann ist es die Funktion der Signatur ist nun void(Foo::*)(int) nicht void(*)(int) der Grund ist, dass nicht-statische member-Funktionen haben einen versteckten Zeiger auf das aufrufende Objekt (this ist ein verstecktes erstes argument) 🙁
  • Er meinte, er kann nicht wirken, lambda.
  • Oh, tut mir Leid, ich kann sehen, wie meine Formulierung könnte missverstanden werden.
  • Kann signal akzeptieren std::function<void(int)> statt?
  • Es erscheint nicht.
  • Es ist eine dumme C-Funktion. Es ist einfach calls die gegeben, Zeiger mit einem einzigen argument.
  • Beachten Sie, dass es vorhanden ist sigaction() und das flag SA_SIGINFO, die vielleicht ein bisschen besser geeignet für Ihre Bedürfnisse die Bereitstellung von mehr Informationen (die sich jedoch nichts ändern, der ursprüngliche Teil der Frage)

InformationsquelleAutor Dan | 2012-05-30
Schreibe einen Kommentar