Подтвердить что ты не робот

Как объявить функцию, которая принимает лямбда?

Я прочитал в Интернете много руководств, в которых объяснялось, как использовать лямбда со стандартной библиотекой (например, std::find), и все они были очень интересными, но я не мог найти ни одного объяснения, как я могу использовать лямбда для моих собственных функций.

Например:

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

    return EXIT_SUCCESS;
}

Как объявить LambdaTest? Какой тип его первого аргумента? И затем, как я могу назвать анонимную функцию, передаваемую ему, например, - "10" в качестве аргумента?

4b9b3361

Ответ 1

Учитывая, что вы, вероятно, также хотите принять указатели на функции и объекты функций в дополнение к lambdas, вы, вероятно, захотите использовать шаблоны для принятия любых аргументов с помощью operator(). Это то, что делают std-функции, такие как find. Это будет выглядеть так:

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

Обратите внимание, что это определение не использует никаких функций С++ 0x, поэтому оно полностью обратно совместимо. Это только вызов функции с использованием лямбда-выражений, что С++ 0x-specific.

Ответ 2

Если вы не хотите, чтобы все шаблоны, вы можете сделать следующее:

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

Ответ 3

Я хотел бы внести этот простой, но объяснительный пример. Он показывает, как передать "вызываемые вещи" (функции, объекты функций и lambdas) в функцию или объект.

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

} // ()