Я играю с созданием модулей 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());
}