Преобразование из v8:: Аргументы в типы С++
Я играю с созданием модулей Node.js в С++, но я в тупике в классе v8:: Arguments. Допустим, у меня есть класс Javascript для отправки электронных писем, у которого есть метод с этой сигнатурой:
Mailer::sendEmail(Array recipients, String sender, String message);
Что будет выглядеть так:
mailer.sendEmail(["[email protected]", "[email protected]"], "[email protected]", "Hi there");
Теперь, в С++, у меня есть функция класса с этой сигнатурой:
SendEmail(const v8::Arguments& args)
Что поддерживает мой метод Mailer:: sendEmail на земле Javascript. Функция SendEmail создаст новый экземпляр моего класса Emailer, который сам имеет функцию класса с этой сигнатурой:
send(std::list<std::string> recipients, std::string from, std::string message)
И здесь я потерялся. Я не знаю, как принимать значения из args и преобразовывать их в обычные типы С++, поэтому я могу передать значения моей функции отправки. Насколько я понимаю, три значения, переданные Mailer:: sendEmail, будут доступны в args [0], args [1] и args [2]. Я даже понимаю, что могу сделать некоторый тип проверки, например if (!args[0]->IsArray())
, но фактически преобразование args [0] в std::list<std::string>
- это то, что я не знаю, как это сделать.
Изменить: Я нашел хакерский способ сделать это, но я все еще думаю, что у 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
Лучший способ, который я могу найти для преобразования типов JS и типов С++ и из них, использует v8-juice, который предоставляет методы литья типов, В частности, я использую v8-convert, который является побочным продуктом v8-сока, который включает только методы преобразования.
Преобразование args [0] в std:: list - это одна строка:
std::list<std::string> values = cvv8::CastFromJS<std::list<std::string> >(args[0]);
Ответ 2
Я знаю, что это более старая тема, но способ, которым я это делаю, выглядит следующим образом:
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);
}
Ответ 3
Если вы используете NaN (собственные абстракции для node), попробуйте этот код:
std::string myString(*NanAsciiString(args[0]));