【问题标题】:How to create v8::FunctionTemplate with C++ lambda function?如何使用 C++ lambda 函数创建 v8::FunctionTemplate?
【发布时间】:2013-04-16 02:01:40
【问题描述】:

我已经阅读了上一个问题here,但它似乎有点无关紧要。当 C++ lambda 没有捕获任何内容时,它可以作为 v8::FunctionTemplate 的参数。但是当它捕获到我需要的东西时,编译器开始抱怨:

error: no matching function for call to 'v8::FunctionTemplate::New( BaseContext::New(const v8::Arguments&)::<lambda(const v8::Arguments&)>)

这里是测试代码:

int a = 3;

Local<FunctionTemplate> failed = FunctionTemplate::New(
[=, a](const Arguments& args)-> Handle<Value>
{   
    a = a+a;
}); 


Local<FunctionTemplate> success = FunctionTemplate::New(
[](const Arguments &args) -> Handle<Value>
{
    int a = 3;
});

我想使用 lambda 功能,因为没有理由定义小的静态函数,这些函数实际上会成为另一个函数中的回调。但是捕获和不捕获之间的唯一区别真的很困扰我,并且错误消息似乎是由 lambda 本身引起的,无论它是否捕获东西。

【问题讨论】:

    标签: c++ node.js lambda v8


    【解决方案1】:

    这是因为不捕获的 lambda 可以被视为普通函数指针,而捕获的 lambda 则不能。

    FunctionTemplate::New 的第一个参数是 InvocationCallback,它只是一个函数指针。

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

    例如,两者都是有效的std::function 对象:

    // Compiles
    function<Handle<Value> (const Arguments&)> cb1 = [](const Arguments &args) -> Handle<Value> {
        int a = 3;
    };
    
    // Compiles
    function<Handle<Value> (const Arguments&)> cb2 = [=](const Arguments &args) -> Handle<Value> {
        int a = 3;
    };
    

    但只有第一个是有效的回调:

    // Compiles
    InvocationCallback cb1 = [](const Arguments &args) -> Handle<Value> {
        int a = 3;
    };
    
    // Does not compile
    InvocationCallback cb2 = [=](const Arguments &args) -> Handle<Value> {
        int a = 3;
    };
    

    【讨论】:

    • 好吧,我认为我在任何地方都避免使用小功能的计划被打破了......至少需要找到更好的方法来做到这一点。无论如何,谢谢您的回答,它有用且清晰。
    • @snowmantw 你想通过捕获传递什么?您也许可以使用 data 参数代替 FunctionTemplate
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 2021-07-18
    • 1970-01-01
    • 2021-03-20
    • 2011-12-04
    相关资源
    最近更新 更多