2011-09-19 97 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()));' –