2016-11-11 3 views
0

ich eine Funktion haben, sagen wir mal,beide Lambda-Funktionen und Funktionszeiger als Argument

void processSomething(Arg1 arg1, Function t){ 
    ... 
    t(someVariable); 
} 

Ich möchte die beiden folgenden Verwendungen arbeiten:

processSomething(myArg1, [&](SomeVariable someVar){...}); 
void(*myFunc)(void) = &someFunc; 
processSomething(myArg1, myFunc); 

Allerdings habe ich festgestellt, dass Ich kann den Lambda-Weg nicht verwenden, wenn ich void(*myFunc)(void) als Parameterdeklaration verwende. Jeder Weg, um beide Verwendungen ohne zwei separate Funktionen oder eine zu komplizierte Verwendung von Wrappern arbeiten zu lassen?

+0

Wenn Sie z.B. [Die Standard-Algorithmus-Funktionen] (http://en.cppreference.com/w/cpp/algorithm) Sie werden sehen, dass alle Funktionen, die ein "Prädikat" nehmen, es als einen Templat-Typ haben werden. –

Antwort

6

Nun, haben Sie zwei Möglichkeiten:

  1. Vorlagen:

    template<class F> 
    void processSomething(Arg1 arg1, F t){ 
    

    Dies ist die bevorzugte Art und Weise, wie es effizienten Code erstellt, aber auf Kosten der möglichen Code-Duplikation.

  2. Mit einem std::function oder so:

    void processSomething(Arg1 arg1, std::function<void(SomeVariable)> t){ 
    

    Es gibt eine Laufzeit-Kosten für die Indirekt beteiligt, aber es wird den gleichen Code in jedem Fall verwenden.

+0

Super, vielen Dank. – user2065501

Verwandte Themen