Node.js加载项类成员函数 在JavaScript对象中公开C++类的静态成员函数的代码看起来类似于 tpl->InstanceTemplate()->Set( String::NewSymbol("thefunc"), FunctionTemplate::New(myclass::myfunc)->GetFunction() );

Node.js加载项类成员函数 在JavaScript对象中公开C++类的静态成员函数的代码看起来类似于 tpl->InstanceTemplate()->Set( String::NewSymbol("thefunc"), FunctionTemplate::New(myclass::myfunc)->GetFunction() );,c++,node.js,C++,Node.js,其中thefunc是可从javascript访问的函数名,该函数映射到类myclass的静态成员myfunc 由于该方法是静态的,我们必须通过一些实例指针访问所有类实例成员,并编写一些样板代码来获取它。例如: static Handle<Value> myclass::myfunc( const Arguments &args ) { myclass *instance = Unwrap<myclass>( args.This() ); // no

其中
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();
}

但是Node.js似乎已经支持这一点,或者有人设计了更好的解决方案。

在我看来,没有办法使用非静态方法来代替静态方法。有两个事实可以证明这一点:

  • 您可以在node.js文档中找到的所有代码示例都促进了静态函数的使用,因此开发人员不会暗示对其库的另一种使用(实际上我从未见过任何其他方法)

  • 由于node.js回调函数是用“static”修饰符声明的,所以本质上需要一些类实例来调用任何实例方法。传统的方法是从“参数”中获取实例。您也可以使用一些“静态”指针指向传递给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);
};
classmyclass:public节点::ObjectWrap
{
...
typedev8::Handle(myclass::*WrappedMethod)(常量v8::参数和参数);
模板
静态v8::Handle方法(常量v8::参数和参数)
{
myclass*obj=ObjectWrap::Unwrap(args.This());
返回(obj->*m)(args);
}
//要导出的非静态成员方法
v8::Handle func1(常量v8::Arguments和args);
v8::Handle func2(常量v8::Arguments和args);
v8::Handle func3(常量v8::参数和参数);
};
在您的
myclass::Init(句柄导出):

tpl->PrototypeTemplate()->Set(String::NewSymbol(“func1”),
FunctionTemplate::New(Method)->GetFunction();
tpl->PrototypeTemplate()->Set(String::NewSymbol(“func2”),
FunctionTemplate::New(Method)->GetFunction();
tpl->PrototypeTemplate()->Set(String::NewSymbol(“func3”),
FunctionTemplate::New(Method)->GetFunction();

整洁!我见过的最简单的方法是+1
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);
};
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());