99 Stimmen

Wie deklariert man eine Funktion, die ein Lambda akzeptiert?

Ich habe im Internet viele Tutorials gelesen, die erklären, wie man Lambdas mit der Standardbibliothek verwendet (z. B. std::find ), und sie waren alle sehr interessant, aber ich konnte keine finden, die erklärt, wie ich ein Lambda für meine eigenen Funktionen verwenden kann.

Zum Beispiel:

int main()
{
    int test = 5;
    LambdaTest([&](int a) { test += a; });

    return EXIT_SUCCESS;
}

Wie soll ich erklären, dass LambdaTest ? Was ist der Typ des ersten Arguments? Und wie kann ich dann die anonyme Funktion aufrufen, wenn ich ihr zum Beispiel "10" als Argument übergebe?

91voto

Wenn Sie nicht alles vorlegen wollen, können Sie Folgendes tun:

#include<functional> 

void LambdaTest (const std::function <void (int)>& f)
{
    ...
}

86voto

sepp2k Punkte 352762

Da Sie neben Lambdas wahrscheinlich auch Funktionszeiger und Funktionsobjekte akzeptieren wollen, werden Sie wahrscheinlich Vorlagen verwenden wollen, um jedes Argument mit einem operator() . Das ist es, was die Standardfunktionen wie find tun. Es würde wie folgt aussehen:

template<typename Func>
void LambdaTest(Func f) {
    f(10);
}

Beachten Sie, dass diese Definition keine C++0x-Funktionen verwendet, so dass sie vollständig rückwärtskompatibel ist. Nur der Aufruf der Funktion mit Lambda-Ausdrücken ist c++0x-spezifisch.

10voto

cibercitizen1 Punkte 19984

Ich möchte dieses einfache, aber selbsterklärende Beispiel beisteuern. Es zeigt, wie man "aufrufbare Dinge" (Funktionen, Funktionsobjekte und Lambdas) an eine Funktion oder ein Objekt übergeben kann.

// g++ -std=c++11 thisFile.cpp

#include <iostream>
#include <thread>

using namespace std;

// -----------------------------------------------------------------
class Box {
public:
  function<void(string)> theFunction; 
  bool funValid;

  Box () : funValid (false) { }

  void setFun (function<void(string)> f) {
    theFunction = f;
    funValid = true;
  }

  void callIt () {
    if ( ! funValid ) return;
    theFunction (" hello from Box ");
  }
}; // class

// -----------------------------------------------------------------
class FunClass {
public:
  string msg;
  FunClass (string m) :  msg (m) { }
  void operator() (string s) {
    cout << msg <<  s << endl; 
  }
};

// -----------------------------------------------------------------
void f (string s) {
  cout << s << endl;
} // ()

// -----------------------------------------------------------------
void call_it ( void (*pf) (string) ) {
  pf( "call_it: hello");
} // ()

// -----------------------------------------------------------------
void call_it1 ( function<void(string)> pf ) {
  pf( "call_it1: hello");
} // ()

// -----------------------------------------------------------------
int main() {

  int a = 1234;

  FunClass fc ( " christmas ");

  f("hello");

  call_it ( f );

  call_it1 ( f );

  // conversion ERROR: call_it ( [&] (string s) -> void { cout << s << a << endl; } );

  call_it1 ( [&] (string s) -> void { cout << s << a << endl; } );

  Box ca;

  ca.callIt ();

  ca.setFun (f);

  ca.callIt ();

  ca.setFun ( [&] (string s) -> void { cout << s << a << endl; } );

  ca.callIt ();

  ca.setFun (fc);

  ca.callIt ();

} // ()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X