我正在编写一个带有接受任意长度参数的函数的Node.js本机模块,它与JS中的类似:
cb = function( )
{
// Receive arguments and do something...
}
foo = function( )
{
cb.apply({}, arguments)
}
foo([1,2,3])
foo([4])
此处,foo
将cb
应用于任意参数。
根据大多数关于回调的Node.js文章,C ++版本都是这样的:
Handle<Value> Foo(const Arguments& args)
{
HandleScope scope;
// Assume that we can get callback from somewhere else.
Local<Function> cb = getExistingCallback();
// Now call it with arbitrary arguments.
cb->Call(Object::New(), args.Length(), args.Data());
return scope.Close(Undefined());
}
但Arguments::Data
只能提供v8::Local<v8::Value>&
,
不是v8::Handle<v8::Value>*
,所以编译器会抛出错误。
因为Local
来自Handle
,所以不是问题。我没有,如果有任何解决方案,我可以使用以避免将所有成员从Data
复制到新数组,然后将其传入。
答案 0 :(得分:1)
Arguments::Data
不是你想要的。如果你看the source,那么这些数据与传递给函数本身的值完全无关。 Data
从implicit_args_
读取,而您想要的数据位于values_
。
我不认为有一种简单的方法可以在不使用operator[]
的情况下获取该信息,所以也许您最好的选择是动态构建列表?您可以使用std::vector
,因为其数据值是连续的。
int argc = args.Length();
std::vector<Local<Value>> argv;
for (int i = 0; i < argc; i++){
argv.push_back(args[i]);
}
cb->Call(Object::New(), argc, &argv[0]);