web-dev-qa-db-ja.com

c ++ 0x:参照によりパラメーターとしてラムダを受け取る適切な方法

参照によってint->intラムダパラメータを受け取る関数を定義する正しい方法は何ですか?

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

または

void f(auto& lambda);

最後の形式が正当な構文であるかどうかはわかりません。

ラムダパラメータを定義する他の方法はありますか?

66
lurscher

autoパラメーターを使用することはできません。基本的に2つのオプションがあります。

オプション#1:示したようにstd::functionを使用します。

オプション#2:テンプレートパラメーターを使用します。

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

オプション#2は、組み込みラムダ関数オブジェクトの潜在的なヒープ割り当てを回避できるため、場合によってはより効率的かもしれませんが、fをテンプレート関数としてヘッダーに配置できる場合にのみ可能です。また、他のテンプレートと同様に、コンパイル時間とIキャッシュのフットプリントが増加する場合があります。ラムダ関数オブジェクトが十分に小さい場合、std::functionオブジェクトでインラインで表される可能性があるため、同様に効果がない可能性があることに注意してください。

72
bdonlan

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

33
Nawaz

私はそれが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は必要ありません

2
Puddle