英文:
lambdas with duktape (using C++)
问题
我想使用在C++中定义的lambda函数调用duk_push_c_function()
,类似于以下方式:
SomeObjType parameter;
// 在 'parameter' 中存储内容
auto myLambda = [parameter](duk_context* ctx) {
// 对 'parameter' 执行操作
return (duk_ret_t)1;
}
duk_push_c_function(ctx, myLambda , 1);
我的问题是这样不会编译,因为myLambda
不是C函数:
error C2664: 'duk_idx_t duk_push_c_function(duk_context *,duk_c_function,duk_idx_t)': 无法将参数 2 从 'MyObjectName::<lambda_07f401c134676d14b7ddd718ad05fbe6>' 转换为 'duk_c_function'
有没有一种简洁的方法将带参数的无名称函数传递给Duktape?
英文:
I want to call duk_push_c_function()
with a lambda defined in C++, a bit like this:
SomeObjType parameter;
// store stuff in 'parameter'
auto myLambda = [parameter](duk_context* ctx) {
// do stuff with parameter
return (duk_ret_t)1;
}
duk_push_c_function(ctx, myLambda , 1);
My problem is that this won't compile because myLambda
is not a C function:
error C2664: 'duk_idx_t duk_push_c_function(duk_context *,duk_c_function,duk_idx_t)': cannot convert argument 2 from 'MyObjectName::<lambda_07f401c134676d14b7ddd718ad05fbe6>' to 'duk_c_function'
Is there a nice way of passing a nameless function with parameters into duktape?
答案1
得分: 3
duk_push_c_function()
期望一个纯C风格的函数指针。非捕获 lambda 可以衰变成这样的指针,但捕获 lambda 不能。因此,您需要将指向您的 parameter
的指针存储在一个存储区中,以便您的 lambda 可以访问它:
存储区允许C代码存储内部状态,这些状态可以安全地与ECMAScript代码隔离开来。
英文:
duk_push_c_function()
expects a plain C-style function pointer. A non-capturing lambda can decay into such a pointer, but a capturing lambda cannot. So, you will have to store a pointer to your parameter
in a stash where your lambda can reach it:
> Stashes allow C code to store internal state which can be safely isolated from ECMAScript code.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论