116

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

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

また

void f(auto& lambda);

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

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

4

5 に答える 5

109

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

オプション#1:std::functionあなたが示したように使用してください。

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

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

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

于 2011-06-23T18:11:13.223 に答える
56

私は次のように使用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

于 2011-06-23T18:13:33.863 に答える