Konwertuj lambda z klauzulą ​​przechwytywania zapisaną w funkcji std :: function na wskaźnik funkcji raw

Od kiedy mójostatnie ostatnie pytanie było niestety sformułowane i zaowocowało rozwiązaniem innego problemu niż mój, tutaj postaram się sformułować mój rzeczywisty problem w jasny sposób.

Zanim zaczniemy, sidenote integruję Javascript Engine V8 z moją aplikacją C ++. To skąd pochodzą wszystkie typy w przykładzie. I to jest powodem tego, że na koniec potrzebuję wskaźnika funkcji surowej. Ale omawiam to poniżej.

Z wnętrza klasy muszę przekazać wyrażenie lambda z klauzulą ​​przechwytywania[=] jako parametr typustd::function do innej funkcji i rzucić ją na wskaźnik funkcji surowej.

W tym kodzieInvocationCallback to po prostu typedef dla funkcji z podpisemHandle<Value>(Arguments const &).

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

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

Wszystkie wyrażenia lambda też mają ten sam podpis. Zauważ, żeHandle<String> jest kompatybilny zHandle<Value> w tym przykładzie. Daje to także silnik Javascript V8.

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

C ++ pozwala mi przekazać tę lambdę jakostd::function do powyższej funkcji. Ale myślę, że wyrażenie lambda przechowuje również odwołanie do obiektu, do którego się odnosi. Jakoś dostęp określony przez[=] musi zostać zrealizowany. To może być powód, dla którego rzucaszstd::function na wskaźnik funkcji raw zawodzi.

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

Nie ma ani błędu czasu kompilacji, ani błędu środowiska wykonawczego, ale debuger mówi mi, że skutkuje to wskaźnikiem zerowym. Ale potrzebuję wskaźnika funkcji surowej do dalszego przetwarzania. Myślę, że mógłbym przekonwertować lambdę późniejstd::bindz referencją lubthis-spinter pierwszy.

Aktualizacja: Ponieważ wydaje się niemożliwe uzyskanie stanu z lambda, to właśnie próbowałem. Kompiluje się, alefunction być wskaźnikiem zerowym.

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>();

}

questionAnswers(2)

yourAnswerToTheQuestion