2012-04-07 11 views
1

habe ich den Code:C++ und currying

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

Dieser Code funktioniert gut. Allerdings möchte ich später noch eine zweite Funktion nennen wie:

auto i = fn(2); 

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

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

+9

Meinten Sie auto i = fn (2)? –

+0

@Vaughn Cato, Yep! thx – Opsa

Antwort

5

Die folgenden Werke zu tun, wie erwartet

#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

By the way gcc 4.5 mit -std = C++ 0x gibt die folgende Fehler, wenn Sie int anstelle von auto verwenden:

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 

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

1

Dies funktioniert für mich:

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

Das Ergebnis fn keine ganze Zahl ist, so dass Sie nicht fn(2) auf eine ganze Zahl zuweisen kann (nicht einmal wissen, warum das kompiliert).

Sie sollten in der Lage sein auto i = fn(2);

+0

tatsächlich kompiliert es nicht. Zumindest mit g ++ – ShinTakezou

+0

Mit g ++ 4.7 funktioniert das gut! – Opsa

+0

Ich meine natürlich, dass 'int i = fn (2);' nicht kompilieren, 'auto i = fn (2)' tut; Ich benutze g ++ 4.5, aber es ist seltsam, dass 4.7 kompiliert ohne Warnung 'int i = fn (2)', da 'fn (2)' es nicht int ist – ShinTakezou