簡體   English   中英

Node.js addon類成員函數

[英]Node.js addon class member functions

在javascript對象中公開C ++類的靜態成員函數的代碼看起來像這樣

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

其中thefunc是可從javascript訪問的函數的名稱,該函數映射到類myclass的靜態成員myfunc

由於該方法是靜態的,我們必須通過一些實例指針訪問所有類實例成員並編寫一些樣板代碼來獲取它。 例如:

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似乎已經支持此功能,或者有人設計了更好的解決方案。

通過引入靜態函數模板,您可以優雅地綁定成員方法:

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

在我看來,沒有辦法使用非靜態方法而不是靜態方法。 有兩個事實可以作為這個論點:

  • 您可以在node.js文檔中找到的所有代碼示例都使用靜態函數,因此開發人員並不意味着他們的庫的另一種用法(實際上我從未遇到任何其他方法)

  • 由於node.js回調函數是使用'static'修飾符聲明的,因此您實際上需要一些類實例才能調用任何實例方法。 傳統方式是從“參數”中獲取實例。 您還可以使用一些“靜態”指針指向傳遞給js代碼的實例,但是它僅適用於一個實例。 如果你想創建更多,你將無法在調用回調時區分它們(當然,如果你不使用一些更復雜的技巧)。

總而言之,使用非靜態功能是不可能的,因為沒有簡單和合法的技術來操作它們

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM