2017-08-08 4 views
0

Ich habe eine Funktion wie:C++, Typdef mit Lambda erfüllen?

typedef void(*timercallback)(void); 
void timer1_attachInterrupt(timercallback userFunc); 

Ich möchte lieber ein Mitglied Methode aufrufen als ein C-Stil-Funktion, so habe ich versucht, die folgende Lambda:

timer1_attachInterrupt([this](void) -> void { _member_method(); }); 

Allerdings habe ich den Compiler Fehler:

No suitable conversion function from "lambda [] void() -> void" to "timercallback" exists

Soweit ich sehen kann, hat das Lambda Leere Argumente wie die typedef und kehrt Leere wie die tyepdef. Was vermisse ich?

+0

Arundo? Wenn ja, fügen Sie das Tag hinzu. – Yakk

Antwort

4

What am I missing?

Die Lambda erzeugt einen Verschluss Objekt da sie Zustand erfassen muss. Daher können Sie es nicht einfach dort übergeben, wo ein regulärer Funktionszeiger erwartet wird.

Da Ihre API keine Vorkehrungen für die Übergabe des Status an den Rückruf vorsieht, müssen Sie etwas Unangenehmes wie globale Variablen verwenden.

Wenn Sie könnentimer1_attachInterrupt ändern , dann empfehle ich Ihnen erlauben es jede (Typ-gelöschten) Funktors zu akzeptieren. std::function ist nur das Programm, das zu erreichen:

using timercallback = void(void); 
void timer1_attachInterrupt(std::function<timercallback> userFunc); 

Es ist ganz klar, dass die OP kann nicht nach dem bearbeiten. Aber ich überlasse den Vorschlag für jeden, der in der Lage sein könnte, ihre ihre Funktionen zu ändern.

+0

Ich kann timer1_attachInterrupt nicht ändern. Ich habe zuvor globale Variablen verwendet und musste die meisten meiner Daten außerhalb der Klasse speichern. Ich habe versucht, es ein wenig mehr OO zu machen. –

+0

@uhsl_m - Ihre Probleme beruhen ausschließlich auf schlechtem API-Design. Der globale Zustand ist es. – StoryTeller