gpt4 book ai didi

c++ - V8 FunctionTemplate 类实例

转载 作者:可可西里 更新时间:2023-11-01 17:38:37 25 4
gpt4 key购买 nike

我有以下类(class):

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

我希望可以从 JavaScript 访问 Register 方法。我像这样将它添加到全局对象中:

PluginManager pluginManagerInstance;

global->Set(String::New("register"), FunctionTemplate::New(pluginManagerInstance.Register));

它抛出以下错误:

'PluginManager::Register': function call missing argument list; use '&PluginManager::Register' to create a pointer to member

我试过这样做,但也没用。这是不正确的,因为我希望它调用 pluginManagerInstance 的 Register 方法。

除了让 Register 方法成为静态的或全局的,还有什么想法吗?

谢谢。

最佳答案

您正试图同时绑定(bind)两件事:实例和要在其上调用的方法,并使其看起来像一个函数指针。不幸的是,这在 C++ 中不起作用。您只能将指针绑定(bind)到普通函数或静态 方法。因此,假设您添加了一个静态“RegisterCB”方法并将其注册为回调:

static Handle<Value> RegisterCB(const Arguments& args);
...FunctionTemplate::New(&PluginManager::RegisterCB)...

现在你从哪里得到 pluginManagerInstance?为此,V8 中的大多数回调注册 api 都有一个额外的“数据”参数,该参数将传递回回调。 FunctionTemplate::New 也是如此。所以你实际上想像这样绑定(bind)它:

...FunctionTemplate::New(&PluginManager::RegisterCB,
External::Wrap(pluginManagerInstance))...

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

return ((PluginManager*)External::Unwrap(args.Data())->Register(args);

这肯定可以通过一些宏变得更容易一些。

关于c++ - V8 FunctionTemplate 类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3171418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com