1

私はコードを持っています:

#include <iostream>

using namespace std;

auto fn = ([](int x){
       return [x](int y) {
          return x * y;
       };
});

int main() {

    int i = fn(2)(4); // 8

    cout << i << endl;

    return 0;
}

このコードは正常に機能します。ただし、後で次のような2番目の関数を呼び出したいと思います。

auto i = fn(2);

i(4); //error: 'i' cannot be used as a function

後で最後の関数を呼び出してから最初の呼び出しにバインドする方法はありますか?

4

3 に答える 3

6

以下は期待通りに動作します

#include <iostream>

using namespace std;

auto fn = [](int x){
       return [x](int y) {
          return x * y;
       };
  };

int main() {

    auto i = fn(2)(4); // 8
    cout << i << endl;
    auto j = fn(2);
    cout << j(4) << endl;

    return 0;
}

追加

ちなみに、-std = c ++0xを指定したgcc4.5では、autoの代わりにintを使用すると、次のエラーが発生します。

currying.cpp:17:17: error: cannot convert ‘&lt;lambda(int)>::<lambda(int)>’ to ‘int’ in initialization
currying.cpp:19:16: error: ‘j’ cannot be used as a function

これは、何が問題になっているのかを知るための「明白な」有用な情報です。

于 2012-04-07T14:52:28.607 に答える
5

の結果は整数でfnはないため、整数に割り当てることはできませんfn(2)(なぜコンパイルされるのかさえわかりません)。

あなたができるはずですauto i = fn(2);

于 2012-04-07T14:51:35.390 に答える
1

これは私のために働きます:

int main() {
    auto i = fn(2);
    cout << i(4) << endl;  // prints 8
    return 0;
}
于 2012-04-07T14:51:31.900 に答える