由于我的
last recent question令人遗憾的措辞并导致解决另一个问题然后我的,我将在这里尝试以明确的方式制定我的实际问题.
在我们开始之前,作为旁注,我正在将Javascript引擎V8集成到我的C应用程序中.这就是示例中所有类型的来源.这也是我最终需要一个原始函数指针这一事实的原因.但我在下面详细说明.
从类内部我需要将一个带有capture子句[=]的lambda表达式作为std :: function类型的参数传递给另一个函数,并将其转换为原始函数指针.
在此代码中,InvocationCallback只是具有签名Handle< Value>(Arguments const&)的函数的typedef.
typedef Handle<Value> (*InvocationCallback)(Arguments const &); void Bind(string Name,function<Handle<Value>(Arguments const &)> Function) { InvocationCallback* function = Function.target<InvocationCallback>(); }
所有lambda表达式也具有相同的签名.请注意Handle< String>与Handle< Value>兼容在这个例子中.它也是由Javascript引擎V8提供的.
Bind("name",[=](const Arguments& args) -> Handle<Value>{ Handle<String> result = String::New(Name().c_str()); return result; });
C允许我将此lambda作为std :: function传递给上面的函数.但是我猜一个lambda表达式也存储了对它引用的对象的引用.不知何故必须实现[=]指定的访问.这可能是将std :: function转换为原始函数指针失败的原因.
InvocationCallback* function = Function.target<InvocationCallback>();
既没有编译时错误也没有运行时错误,但调试器告诉我它会产生空指针.但我需要原始函数指针进行进一步处理.我想我可以在std ::绑定引用或this-pointer之后转换lambda.
更新:由于似乎无法将状态从lambda中取出,这就是我尝试过的.它编译但函数出来是一个空指针.
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>(); }