从v8::Arguments到c++类型的转换
Converting from v8::Arguments to C++ Types
我正在用c++创建Node.js模块,但是我被v8::Arguments类难住了。假设我有一个用于发送电子邮件的Javascript类,它有一个签名如下的方法:
Mailer::sendEmail(Array recipients, String sender, String message);
可以这样调用:
mailer.sendEmail(["joe@gmail.com", "sally@gmail.com"], "fred@gmail.com", "Hi there");
现在在c++领域,我有一个这样签名的类函数:
SendEmail(const v8::Arguments& args)
支持我的Mailer::sendEmail方法在Javascript的土地。SendEmail函数将创建我的Emailer类的一个新实例,它本身有一个具有以下签名的类函数:
send(std::list<std::string> recipients, std::string from, std::string message)
这就是我迷路的地方。我不知道如何从参数中获取值,并将它们转换为常规的c++类型,所以我可以将值传递给我的send函数。据我所知,传递给Mailer::sendEmail的3个值将在args[0], args[1]和args[2]中可用。我甚至知道我可以做一些类型检查,如if (!args[0]->IsArray())
,但实际上将args[0]转换为std::list<std::string>
是我不知道如何做的。
编辑:我找到了一种hack的方法来做这件事,但我仍然认为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());
}
我知道这是一个古老的话题,但我倾向于这样做:
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(节点的本地抽象),那么试试下面的代码:
std::string myString(*NanAsciiString(args[0]));
我能找到的转换JS类型和c++类型的最好方法是使用v8-juice,它提供了类型转换方法。具体来说,我使用的是v8-convert,这是v8-juice的派生版本,它只包括转换方法。
将args[0]转换为std::list只需一行:
std::list<std::string> values = cvv8::CastFromJS<std::list<std::string> >(args[0]);
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- 我应该使用什么来代替void作为变体中的替代类型之一
- 类中的字符串不命名类型