[c++] C ++ 0x : 람다를 참조로 매개 변수로받는 적절한 방법
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);
}