Конвертировать лямбда с предложением захвата, хранящимся в 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();
}