Können wir den Typ eines lambda-argument?

Mit std::function können wir die Art von argument mit der argument_type, second_argument_type etc. typedefs, aber ich kann nicht einen Weg finden, das gleiche zu tun, mit lambdas. Ist es möglich? (Ich verwende VS2010)

Sagen, ich will sowas wie das folgende in meine Deserialisierung system dient zum Lesen eines Objekt und übergeben es an eine setter-Funktion:

template<typename F> 
static void forward(F f)
{ 
    //Create an object of the type of the first
    //parameter to the function object F
    typedef typename F::argument_type T;
    T t;

    //...do something with 't' here (deserialize in my case)

    //Forward the object to the function
    f(t);
}

Es verwendet werden kann, wie dies und alles funktioniert einwandfrei:

std::function<void(int)> f = [](int i) -> void { setValue(i); };
forward(f);

Aber es arbeitet nicht direkt mit lambdas:

forward([](int i) -> void { setValue(i); });
//error C2039: 'argument_type' : is not a 
//member of '`anonymous-namespace'::<lambda1>'

Gibt es eine Möglichkeit, den Zugriff auf die parameter-Typen in einer Weise, die die Arbeit für beide lambdas und std::function Objekte? Vielleicht ein Weg, um die std::function Typ eines lambda-zuerst, und dann die argument_type aus?


Folgenden sich aus der Antwort unten eine version, die funktioniert mit lambdas und std::function ist:

template<typename T, typename F> 
static void forward(F f)
{ 
    T t;

    //...do something with 't' here (deserialize in my case)

    f(t);
}

forward<int>([](int i) -> void { setValue(i); });

Seit int ist hier wiederholt ich hatte gehofft, es loszuwerden - gar nicht so schlecht für int aber mehr ärgerlich für lange Namen von Typen in ein paar namespaces. C ' est la vie!

Kurze Antwort: Nein.
Lange Antwort: ja, siehe unten.

InformationsquelleAutor Chris Caulfield | 2011-06-28

Schreibe einen Kommentar