Converting from v8::Arguments to C++ Types
我正在玩用C++创建多个模块,但我在V8:参数类上被难住了。假设我有一个用于发送电子邮件的javascript类,它有一个带有此签名的方法:
1 | Mailer::sendEmail(Array recipients, String sender, String message); |
这就叫做:
1 |
号
现在在C++领域中,我有一个带有这个签名的类函数:
1 | SendEmail(const v8::Arguments& args) |
这是在javascriptLand中支持我的mailer::sendmail方法。sendemail函数将创建我的emailer类的一个新实例,它本身有一个带有此签名的类函数:
1 | send(std::list<std::string> recipients, std::string from, std::string message) |
。
这就是我迷路的地方。我不知道如何从ARG中获取值,并将它们转换成规则的C++类型,这样我就可以将这些值传递给我的发送函数。据我所知,传递给mailer::sendmail的3个值在args[0]、args[1]和args[2]中可用。我甚至理解我可以做一些类型检查,比如
编辑:我发现了一种黑客的方法,但我仍然认为V8有一些内置的方法来以更干净的方式处理这个问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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()); } |
我知道这是一个老话题,但我倾向于这样做的方式如下:
1 2 3 4 5 6 7 8 9 | Handle<Value> MethodName (const Arguments& args) { // get the param v8::String::Utf8Value param1(args[0]->ToString()); // convert it to string std::string foo = std::string(*param1); } |
号
如果您使用的是NAN(节点的本机抽象),请尝试以下代码:
1 | std::string myString(*NanAsciiString(args[0])); |
我能找到的转换JS类型和C++类型的最好方法是使用V8Cube,它提供类型转换方法。具体来说,我使用的是V8 Convert,它是V8 Juice的衍生产品,只包括转换方法。
将ARGs(0)转换为STD::列表是一行:
1 | std::list<std::string> values = cvv8::CastFromJS<std::list<std::string> >(args[0]); |