2

在 javascript 对象中公开 C++ 类的静态成员函数的代码如下所示

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

映射到类的静态成员的thefuncjavascript 可访问的函数名称在哪里。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

在我看来,没有办法使用非静态方法代替静态方法。有两个事实可以作为这方面的论据:

  • 您可以在 node.js 文档中找到的所有代码示例都提倡使用静态函数,因此开发人员并不暗示他们的库的其他用途(实际上我从未遇到过任何其他方法)

  • 由于 node.js 回调函数是使用 'static' 修饰符声明的,因此您基本上需要一些类实例来调用任何实例方法。传统方法是从“参数”中获取实例。您也可以使用一些“静态”指针指向您传递给 js 代码的实例,但它仅适用于一个实例。如果您想创建更多,则在调用回调时将无法区分它们(当然,如果您不使用一些更复杂的技巧)。

总而言之,使用非静态函数是相当不可能的,因为没有简单和合法的技术来操作它们

于 2013-03-14T16:45:09.607 回答