我正在玩C++中创建Node.js模块,但我难住了v8 :: Arguments类。可以说我有用于发送电子邮件一个Javascript类,它有与此签名的方法:从v8 ::参数转换为C++类型
Mailer::sendEmail(Array recipients, String sender, String message);
这将是这样调用:
mailer.sendEmail(["[email protected]", "[email protected]"], "[email protected]", "Hi there");
现在,在C++的土地,我有一个类功能与此签名:
SendEmail(const v8::Arguments& args)
这是支持我的梅勒:: sendEmail方法在Javascript土地。该SendEmail函数将创建我的emailer类,它本身就具有这种特征的一类功能的新实例:
send(std::list<std::string> recipients, std::string from, std::string message)
而这正是我迷路了。我不知道如何从参数中取值,并将它们转换成常规的C++类型,所以我可以将这些值传递给我的函数发送函数。据我所知,传递给Mailer :: sendEmail的3个值将在args [0],args [1]和args [2]中可用。我甚至明白我可以做一些类型检查,如if (!args[0]->IsArray())
,但实际上转换args [0]到std::list<std::string>
是我不知道该怎么做。
编辑︰我发现这样做的一个hackish的方式,但我仍然认为V8有一些内置的方法来处理这个更清洁的方式。
static Handle<Value> SendEmail(const Arguments& args)
{
HandleScope scope;
list<string> values;
Local<Object> obj = args[0]->ToObject();
Local<Array> props = obj->GetPropertyNames();
// Iterate through args[0], adding each element to our list
for(unsigned int i = 0; i < props->Length(); i++) {
String::AsciiValue val(obj->Get(i)->ToString());
values.push_front(string(*val));
}
// Display the values in the list for debugging purposes
for (list<string>::iterator it = values.begin(); it != values.end(); it++) {
cout << *it << endl;
}
return scope.Close(args.This());
}
@Thomas这个答案是*痛苦*含糊。另外,在V8中无疑有将args转换为C++类型的正确方法。 – mellowsoon
@mellowsoon恩惠 – hplbsh