C ++ 0x : 람다를 참조로 매개 변수로받는 적절한 방법 lambda); 또는 void

int->int참조 로 람다 매개 변수 를받는 함수를 정의하는 올바른 방법은 무엇입니까 ?

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

또는

void f(auto& lambda);

마지막 형식이 합법적 인 구문인지 잘 모르겠습니다.

람다 매개 변수를 정의하는 다른 방법이 있습니까?



답변

auto매개 변수를 가질 수 없습니다 . 기본적으로 두 가지 옵션이 있습니다.

옵션 # 1 : std::function표시된대로 사용하십시오 .

옵션 # 2 : 템플릿 매개 변수 사용 :

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

옵션 # 2는 경우에 따라 포함 된 람다 함수 개체에 대한 잠재적 인 힙 할당을 피할 수 있기 때문에 더 효율적일 수 있지만 f헤더에 템플릿 함수로 배치 할 수있는 경우에만 가능 합니다. 또한 모든 템플릿과 마찬가지로 컴파일 시간과 I- 캐시 공간을 늘릴 수 있습니다. 람다 함수 개체가 충분히 작은 경우 std::function개체 에서 인라인으로 표시 될 수 있으므로 효과가 없을 수도 있습니다 .


답변

다음 template과 같이 사용 합니다.

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 
}

산출:

500
1000
100

데모 : http://www.ideone.com/EayVq


답변

7 년이 지났다는 것을 알고 있지만 여기에 아무도 언급하지 않은 방법이 있습니다.

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;});
}

출력되는 내용 :

foo
lambda 1

템플릿이나 std :: function 필요 없음


답변

void f(auto& lambda);

가까워요. 실제로 컴파일되는 것은 다음과 같습니다.

#include <cassert>

/*constexpr optional*/ const auto f = [](auto &&lambda)
{
  lambda();
  lambda();
};

int main()
{
  int counter = 0;
  f([&]{ ++counter; });
  assert(counter == 2);
}