2

javascript オブジェクトで C++ クラスの静的メンバー関数を公開するコードは、次のようになります。

tpl->InstanceTemplate()->Set( String::NewSymbol("thefunc"), FunctionTemplate::New(myclass::myfunc)->GetFunction() );

classthefuncの static メンバーにマップする JavaScript からアクセスできる関数の名前はどこにありますか。myfuncmyclass

メソッドは静的であるため、何らかのインスタンス ポインターを介してすべてのクラス インスタンス メンバーにアクセスし、それに到達するためのボイラープレート コードを記述する必要があります。例えば:

static Handle<Value> myclass::myfunc( const Arguments &args )
{
    myclass *instance = Unwrap<myclass>( args.This() );
    // now use 'instance' like 'this'
    return True();
}

インターフェイスにメンバー関数を設定し、それをクラス インスタンスにバインドして、ボイラープレートを使用した静的関数を回避し、システムを非静的メソッドに直接呼び出して、「this」ポインターを使用できるようにすることが可能かどうかを知りたいです。

#define「this」をアンラップし、メンバー関数へのすべての呼び出しを転送するプロキシ関数を含むテンプレート クラスに展開することを含む醜い方法を考えることができます。これにより、次のようなセットアップ コードが生成されます。

DECLARE_MEMBER_FUNCTION( thefunc_handle, myclass, myfunc );
tpl->InstanceTemplate()->Set( String::NewSymbol("thefunc"), thefunc_handle );

しかし、Node.js はすでにこれをサポートしているか、誰かがより良い解決策を考案したようです。

4

2 に答える 2

5

静的関数テンプレートを導入することで、メンバー メソッドを適切にバインドできます。

class myclass : public node::ObjectWrap
{
    ...

    typedef v8::Handle<v8::Value> (myclass::*WrappedMethod)(const v8::Arguments& args);

    template<WrappedMethod m>
    static v8::Handle<v8::Value> Method(const v8::Arguments& args)
    {
        myclass* obj = ObjectWrap::Unwrap<myclass>(args.This());
        return (obj->*m)(args);
    }

    // Non-static member methods to be exported
    v8::Handle<v8::Value> func1(const v8::Arguments& args);
    v8::Handle<v8::Value> func2(const v8::Arguments& args);
    v8::Handle<v8::Value> func3(const v8::Arguments& args);
};

あなたにmyclass::Init(Handle<Object> exports):

tpl->PrototypeTemplate()->Set(String::NewSymbol("func1"),
    FunctionTemplate::New(Method<&myclass::func1>)->GetFunction());
tpl->PrototypeTemplate()->Set(String::NewSymbol("func2"),
    FunctionTemplate::New(Method<&myclass::func2>)->GetFunction());
tpl->PrototypeTemplate()->Set(String::NewSymbol("func3"),
    FunctionTemplate::New(Method<&myclass::func3>)->GetFunction());
于 2013-03-19T16:02:28.840 に答える
2

静的メソッドの代わりに非静的メソッドを使用する方法はないように思われます。そして、これの議論として役立つかもしれない2つの事実が存在します:

  • node.jsのドキュメントにあるすべてのコードサンプルは静的関数の使用を促進しているため、開発者はライブラリの別の使用を暗示していません(実際、他のアプローチに出会ったことはありません)

  • node.jsコールバック関数は「static」修飾子で宣言されているため、インスタンスメソッドを呼び出すには基本的にクラスインスタンスが必要です。従来の方法は、「引数」からインスタンスを取得することです。jsコードに渡したインスタンスへの「静的」ポインタを使用することもできますが、これは1つのインスタンスに対してのみ機能します。さらに作成したい場合は、コールバックが呼び出されたときにそれらを区別できません(もちろん、より高度なトリックを使用しない場合)。

要約すると、非静的機能を使用することはかなり不可能です。なぜなら、それらを操作するための単純で合法的な技術がないからです。

于 2013-03-14T16:45:09.607 に答える