Frage an design-patterns, c++11, c++, currying – C ++ und Currying

1

Ich habe den Code:

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

Dieser Code funktioniert gut. Ich möchte jedoch später eine zweite Funktion aufrufen:

<code>auto i = fn(2);

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

Gibt es eine Möglichkeit, die letzte Funktion später aufzurufen und dann beim ersten Aufruf zu binden?

Meinten Sie auto i = fn (2)? Vaughn Cato
@ Vaughn Cato, Yep! Vielen Dank Opsa

Deine Antwort

3   die antwort
5

Das Ergebnis vonfn ist keine Ganzzahl, daher können Sie keine zuweisenfn(2) zu einer ganzen Zahl (weiß nicht einmal, warum das kompiliert).

Das solltest du könnenauto i = fn(2);

Mit g ++ 4.7 klappt das einwandfrei! Opsa
Ich meine das natürlichint i = fn(2); kompiliert nicht,auto i = fn(2) tut; Ich verwende g ++ 4.5, aber es ist seltsam, dass 4.7 ohne Vorwarnung kompiliert wirdint i = fn(2), schon seitfn(2) es ist nicht int ShinTakezou
in der Tat kompiliert es nicht. Zumindest mit g ++ ShinTakezou
6

Das Folgende funktioniert wie erwartet

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

HINZUFÜGEN

Übrigens gibt gcc 4.5 mit -std = c ++ 0x den folgenden Fehler aus, wenn Sie int anstelle von auto verwenden:

<code>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
</code>

Das ist eine "offensichtliche" und nützliche Information, um herauszufinden, was schief geht.

1

Das funktioniert bei mir:

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

Verwandte Fragen