Convierta lambda con la cláusula de captura almacenada en std :: function al puntero de función en bruto

Desde miúltima pregunta reciente Desafortunadamente, estaba redactado y resultó en una solución a otro problema que el mío. Aquí trataré de formular mi problema real de una manera clara.

Antes de comenzar, como una nota al margen, estoy integrando el Javascript Engine V8 en mi aplicación C ++. De ahí provienen todos los tipos del ejemplo. Y esa es también la razón por la que necesito un puntero de función en bruto al final. Pero me refiero a esto a continuación.

Desde dentro de una clase necesito pasar una expresión lambda con la cláusula de captura[=] como parámetro del tipostd::function a otra función y convertirlo en un puntero de función en bruto allí.

En este código,InvocationCallback es simplemente un typedef para una función con la firmaHandle<Value>(Arguments const &).

typedef Handle<Value> (*InvocationCallback)(Arguments const &);

void Bind(string Name, function<Handle<Value>(Arguments const &)> Function)
{
    InvocationCallback* function = Function.target<InvocationCallback>();
}

Todas las expresiones lambda tienen la misma firma, también. Tenga en cuenta queHandle<String> es compatible conHandle<Value> en este ejemplo. Está dado por el Javascript Engine V8, también.

Bind("name", [=](const Arguments& args) -> Handle<Value>{
    Handle<String> result = String::New(Name().c_str());
    return result;
});

C ++ me permite pasar este lambda comostd::function a la función de arriba. Pero supongo que una expresión lambda también almacena una referencia al objeto al que hace referencia. De alguna manera el acceso especificado por[=] debe ser realizado Esas podrían ser las razones por las questd::function a un puntero de función en bruto falla.

InvocationCallback* function = Function.target<InvocationCallback>();

No hay un error de tiempo de compilación ni un error de tiempo de ejecución, pero el depurador me dice que da como resultado un puntero nulo. Pero necesito el puntero de la función en bruto para su posterior procesamiento. Supongo que podria convertir el lambda despuesstd::binding la referencia othis-punto primero

Actualización: ya que parece ser imposible sacar el estado de la lambda, esto es lo que intenté. Se compila masfunction Salir para ser un puntero nulo.

Bind("name", this, [](Base* object, const Arguments& args) -> Handle<Value>{
    return v8::String::New(((Derived*)object)->Name().c_str());
});

void Bind(string Name, Module *Object, function<Handle<Value>(Module*, Arguments const &)> Function)
{
    function<Handle<Value>(Arguments const &)> method = std::bind(Function, Object, std::placeholders::_1);
    InvocationCallback* function = method.target<InvocationCallback>();

}

Respuestas a la pregunta(2)

Su respuesta a la pregunta