Вопрос по c++, c++11 – С ++ и карри

1

Я использую код:

<code>#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;
}
</code>

Этот код работает нормально. Однако позже я хочу вызвать вторую функцию, например:

<code>auto i = fn(2);

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

Есть ли способ вызвать последнюю функцию позже, а затем связать с первым вызовом?

Вы имели в виду auto i = fn (2)? Vaughn Cato
@ Вон Катон, да! Спасибо Opsa

Ваш Ответ

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

ADD

Кстати, gcc 4.5 с -std = c ++ 0x выдает следующую ошибку, если вы используете int вместо auto:

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

что является "очевидным" и полезную информацию, чтобы понять, что происходит не так.

5

Результатfn не является целым числом, поэтому вы не можете назначитьfn(2) в целое число (даже не знаю, почему это компилируется).

Вы должны быть в состоянии сделатьauto i = fn(2);

С g ++ 4.7 отлично работает! Opsa
действительно, он не компилируется. По крайней мере с g ++
Я имею в виду, конечно, чтоint i = fn(2); не компилируется,auto i = fn(2) делает; Я использую g ++ 4.5, но странно, что 4.7 компилируется без предупрежденияint i = fn(2), посколькуfn(2) это не int
1

Это работает для меня:

int main() {
    auto i = fn(2);
    cout << i(4) << endl;  // prints 8
    return 0;
}

Похожие вопросы