Подтвердить что ты не робот

Преобразование из 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());
}
4b9b3361

Ответ 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);    

}