1

我正在编写一个带有接受任意长度参数的函数的 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到新数组然后将其传入。

4

1 回答 1

1

Arguments::Data不是你想要的。如果您查看source,该数据与传递给函数本身的值完全无关。当你想要的数据在时Data读取。implicit_args_values_

我认为没有一种简单的方法可以在不使用的情况下获取该信息,operator[]因此您最好的选择是动态构建列表?您可以使用 a 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]);
于 2013-04-11T05:09:32.970 回答