2011-09-19 94 views
28

我正在玩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()); 
} 
+1

@Thomas这个答案是*痛苦*含糊。另外,在V8中无疑有将args转换为C++类型的正确方法。 – mellowsoon

+0

@mellowsoon恩惠 – hplbsh

回答

6

我能找到的转换和从JS类型和C++类的最佳方式,是使用v8-juice,它提供了类型转换的方法。具体来说,我使用的是v8-convert,它是v8果汁的分支,仅包含转换方法。

转换ARGS [0]到std ::列表是一个行:

std::list<std::string> values = cvv8::CastFromJS<std::list<std::string> >(args[0]); 
+4

关于V8果汁的警告: https://code.google.com/p/v8-juice/ ACHTUNG ACHTUNG ACHTUNG:截至2013年8月19日,该项目正在因为学位在2013年上半年发布的核心v8中不兼容的更改。v8 API正在以与每个v8使用不兼容的方式进行大幅度更改...... – Logan

48

我知道这是一个老话题,但方式我倾向于做,这是如下:

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);  

} 
+2

虽然不具有吸引力,但我确信您可以将上述内容:'std :: string param1(* v8 :: String :: Utf8Value(args [0] - > ToString()));' –