wake-up-neo.com

c ++ 0x: Richtiger Weg, um ein Lambda als Parameter per Referenz zu erhalten

Was ist der richtige Weg, um eine Funktion zu definieren, die ein int->int Lambda-Parameter als Referenz?

void f(std::function< int(int) >& lambda);

oder

void f(auto& lambda);

Ich bin mir nicht sicher, ob die letzte Form überhaupt eine legale Syntax ist.

Gibt es andere Möglichkeiten, einen Lambda-Parameter zu definieren?

66
lurscher

Sie können keinen auto -Parameter haben. Sie haben grundsätzlich zwei Möglichkeiten:

Option 1: Verwenden Sie std::function, Wie Sie gezeigt haben.

Option 2: Verwenden Sie einen Vorlagenparameter:

template<typename F>
void f(F &lambda) { /* ... */}

Option 2 kann in einigen Fällen effizienter sein, da eine potenzielle Heap-Zuweisung für das eingebettete Lambda-Funktionsobjekt vermieden werden kann. Dies ist jedoch nur möglich, wenn f als Vorlagenfunktion in einem Header platziert werden kann. Es kann auch die Kompilierungszeiten und den Platzbedarf im I-Cache erhöhen, ebenso wie jede Vorlage. Beachten Sie, dass dies möglicherweise auch keine Auswirkungen hat. Wenn das Lambda-Funktionsobjekt klein genug ist, wird es möglicherweise im Objekt std::function Inline dargestellt.

72
bdonlan

Ich würde template verwenden als:

template<typename Functor>
void f(Functor functor)
{
   cout << functor(10) << endl;
}

int g(int x)
{
    return x * x;
}
int main() 
{
    auto lambda = [] (int x) { cout << x * 50 << endl; return x * 100; };
    f(lambda); //pass lambda
    f(g);      //pass function 
}

Ausgabe:

500
1000
100

Demo: http://www.ideone.com/EayVq

33
Nawaz

Ich weiß, dass es 7 Jahre her ist, aber hier ist ein Weg, den niemand sonst erwähnte:

void foo(void (*f)(int)){
    std::cout<<"foo"<<std::endl;
    f(1); // calls lambda which takes an int and returns void
}
int main(){
    foo([](int a){std::cout<<"lambda "<<a<<std::endl;});
}

Welche Ausgänge:

foo
lambda 1

Keine Vorlagen oder std :: -Funktion erforderlich

2
Puddle