[c++] 람다를 받아들이는 함수를 선언하는 방법은 무엇입니까?

인터넷에서 표준 라이브러리 (예 :)와 함께 람다를 사용하는 방법을 설명하는 많은 자습서를 읽었으며 std::find모두 매우 흥미로 웠지만 내 함수에 람다를 사용하는 방법을 설명하는 자습서를 찾을 수 없었습니다.

예를 들면 :

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

    return EXIT_SUCCESS;
}

어떻게 신고해야 LambdaTest합니까? 첫 번째 인수의 유형은 무엇입니까? 그런 다음 익명 함수를 어떻게 호출 할 수 있습니까? 예를 들어 “10”을 인수로 전달할 수 있습니까?



답변

람다 외에 함수 포인터와 함수 객체도 허용하려는 경우 템플릿을 사용하여 operator(). 이것은 find와 같은 표준 함수가하는 일입니다. 다음과 같이 표시됩니다.

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

이 정의는 C ++ 0x 기능을 사용하지 않으므로 완전히 이전 버전과 호환됩니다. C ++ 0x와 관련된 람다 식을 사용하는 함수에 대한 호출 일뿐입니다.


답변

모든 항목을 템플릿으로 지정하지 않으려면 다음을 수행 할 수 있습니다.

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


답변

이 간단하지만 자명 한 예제를 제공하고 싶습니다. “호출 가능한 것”(함수, 함수 객체 및 람다)을 함수 또는 객체에 전달하는 방법을 보여줍니다.

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

} // ()


답변