Конвертировать лямбда с предложением захвата, хранящимся в std :: function, в необработанный указатель на функцию

Так как мойпоследний недавний вопрос был, к сожалению, сформулирован и привел к решению другой проблемы, чем моей, здесь я попытаюсь сформулировать мою актуальную проблему ясным способом.

Прежде чем мы начнем, как отдельную заметку, я интегрирую Javascript Engine V8 в свое приложение C ++. Тот's, откуда берутся все типы в примере. И этоЭто также причина того, что в конце мне нужен необработанный указатель на функцию. Но я подробно остановлюсь на этом ниже.

Внутри класса мне нужно передать лямбда-выражение с предложением capture[=] как параметр типаstd::function в другую функцию и приведите ее к необработанному указателю на функцию.

В этом кодеInvocationCallback это просто typedef для функции с подписью.Handle(Arguments const &)

typedef Handle (*InvocationCallback)(Arguments const &);

void Bind(string Name, function Function)
{
    InvocationCallback* function = Function.target();
}

Все лямбда-выражения тоже имеют одинаковую подпись. Обратите внимание, чтоHandle совместим сHandle в этом примере. Это'также дано Javascript Engine V8.

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

C ++ позволяет мне передавать эту лямбду какstd::function к функции выше. Но я думаю, что лямбда-выражение также хранит ссылку на объект, на который оно ссылается. Каким-то образом доступ указан[=] должен быть реализован. Это может быть причиной того, чтоstd::function к необработанному указателю функции не удается.

InvocationCallback* function = Function.target();

Нет ни ошибки времени компиляции, ни ошибки времени выполнения, но отладчик говорит мне, что это приводит к нулевому указателю. Но мне нужен необработанный указатель на функцию для дальнейшей обработки. Я думаю, что я мог бы преобразовать лямбду послеstd::bindс помощью ссылки илиthisуказатель первый.

Обновление: так как кажется, что невозможно вывести состояние из лямбды, это то, что я пытался. Компилируется ноfunction выйти, чтобы быть нулевым указателем.

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

void Bind(string Name, Module *Object, function Function)
{
    function method = std::bind(Function, Object, std::placeholders::_1);
    InvocationCallback* function = method.target();

}

Ответы на вопрос(2)

Ваш ответ на вопрос