Comment déclarer une fonction qui accepte un lambda?

J'ai lu sur internet de nombreux tutoriels qui expliquaient comment utiliser lambdas avec la bibliothèque standard (comme std::find), et ils étaient tous très intéressants, mais je n'en ai trouvé aucun qui expliquait comment utiliser un lambda pour mes propres fonctions.

Par exemple:

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

    return EXIT_SUCCESS;
}

Comment dois-je déclarer LambdaTest? Quel est le type de ses arguments? Et puis, comment puis-je appeler la fonction anonyme passant - par exemple - "10" comme argument?

58
demandé sur Andreas Bonini 2010-05-30 16:20:17

3 réponses

Étant donné que vous voulez probablement aussi accepter des pointeurs de fonction et des objets de fonction en plus de lambdas, vous voudrez probablement utiliser des modèles pour accepter tout argument avec un operator(). C'est ce que font les fonctions std comme find. Cela ressemblerait à ceci:

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

Notez que cette définition n'utilise aucune fonctionnalité c++0x, elle est donc complètement rétrocompatible. C'est seulement l'appel à la fonction utilisant des expressions lambda qui est spécifique à c++0x.

59
répondu sepp2k 2010-05-30 12:33:00

Si vous ne voulez pas tout modéliser, vous pouvez faire ce qui suit:

void LambdaTest (const std::function <void (int)>& f)
{
    ...
}
57
répondu doublep 2010-05-30 12:32:05

Je voudrais apporter cet exemple simple mais explicite. Il montre comment passer des "choses appelables" (fonctions, objets de fonction et lambdas) à une fonction ou à un objet.

// 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 ();

} // ()
4
répondu cibercitizen1 2014-12-23 22:35:43