V8 FunctionTemplate类实例

Alo*_*kin 8 c++ static v8 instance

我有以下课程:

class PluginManager
{
public:
    Handle<Value> Register(const Arguments& args);
    Handle<ObjectTemplate> GetObjectTemplate();
};  
Run Code Online (Sandbox Code Playgroud)

我希望可以从JavaScript访问Register方法.我将它添加到全局对象,如下所示:

PluginManager pluginManagerInstance;

global->Set(String::New("register"), FunctionTemplate::New(pluginManagerInstance.Register)); 
Run Code Online (Sandbox Code Playgroud)

它会引发以下错误:

'pluginManager :: Register':函数调用缺少参数列表; 使用'&PluginManager :: Register'创建指向成员的指针

我试图这样做,但它也不起作用.并且它不正确,因为我希望它调用pluginManagerInstance的Register方法.

除了使Register方法静态或全局,任何想法?

谢谢.

mer*_*nst 7

你试图同时绑定两件事:实例和调用它的方法,让它看起来像一个函数指针.不幸的是,这在C++中不起作用.您只能将指针绑定到普通函数或静态方法.因此,您可以添加静态"RegisterCB"方法并将其注册为回调:

static Handle<Value> RegisterCB(const Arguments& args);
...FunctionTemplate::New(&PluginManager::RegisterCB)...
Run Code Online (Sandbox Code Playgroud)

现在从哪里获取pluginManagerInstance?为此,V8中的大多数回调注册apis都有一个额外的"data"参数,该参数将被传递回回调.FunctionTemplate :: New也是如此.所以你实际上想要像这样绑定它:

...FunctionTemplate::New(&PluginManager::RegisterCB,
                         External::Wrap(pluginManagerInstance))...
Run Code Online (Sandbox Code Playgroud)

然后可以通过args.Data()获取数据,您可以委托实际方法:

return ((PluginManager*)External::Unwrap(args.Data())->Register(args);
Run Code Online (Sandbox Code Playgroud)

对于某些宏,这肯定会变得容易一些.