我正在玩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