web-dev-qa-db-ja.com

v8 :: ArgumentsからC ++型への変換

C++でNode.jsモジュールを作成して遊んでいますが、v8 :: Argumentsクラスに困惑しています。電子メールを送信するためのJavascriptクラスがあり、このシグネチャを持つメソッドがあるとします。

_Mailer::sendEmail(Array recipients, String sender, String message);
_

これは次のように呼ばれます:

_mailer.sendEmail(["[email protected]", "[email protected]"], "[email protected]", "Hi there");
_

今C++の土地で、私はこのシグネチャを持つクラス関数を持っています:

_SendEmail(const v8::Arguments& args)
_

JavaScriptランドの私のMailer :: sendEmailメソッドをサポートしています。 SendEmail関数は、Emailerクラスの新しいインスタンスを作成します。これには、次のシグネチャを持つクラス関数があります。

_send(std::list<std::string> recipients, std::string from, std::string message)
_

そして、これは私が迷っているところです。 argsから値を取得して通常のC++型に変換する方法がわからないので、値をsend 関数。私が理解しているように、Mailer :: sendEmailに渡される3つの値は、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());
}
_
31
mellowsoon

JS型とC++型の間で変換するために見つけることができる最良の方法は、型キャストメソッドを提供する v8-juice を使用することです。具体的には v8-convert を使用しています。これはv8-juiceから派生したもので、変換方法のみが含まれています。

Args [0]からstd :: listへの変換は1行です:

std::list<std::string> values = cvv8::CastFromJS<std::list<std::string> >(args[0]);
6
mellowsoon

私はこれが古いトピックであることを知っていますが、私がこれを行う傾向がある方法は次のとおりです:

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);    

}
50
Ryan

NaN( ノードのネイティブ抽象化 )を使用している場合は、次のコードを試してください。

std::string myString(*NanAsciiString(args[0])); 
6
Segfault