gpt4 book ai didi

c++ - 将类的成员函数传递给回调函数?

转载 作者:行者123 更新时间:2023-11-28 00:55:33 25 4
gpt4 key购买 nike

我有这个模板:

template <class T>
v8::Handle<v8::Value> jsFunctionTemplate(const v8::Arguments &args)
{
T *t = static_cast<T*>(args.This()->GetPointerFromInternalField(0));
if (t != NULL) t->volume(args[0]->NumberValue());
return args.This();
}

我想让它 100% 动态,所以我希望用指针 (std::mem_fn?) 替换 t->volume。问题是,我无法从类似的示例/问题中弄清楚如何保留 jsFunctionTemplate 的当前类型(它必须是 v8::InvocationCallback)

typedef Handle<Value> (*InvocationCallback)(const Arguments& args);

所以它的用法仍然可以是:

audio->PrototypeTemplate()->Set("Volume", v8::FunctionTemplate::New(&jsFunctionTemplate<Audio>));

我什至不反对使用 C++11 语法。

最佳答案

我并不声称完全理解 v8 API 在这里强加的限制,但是如果类型的模板参数没问题,那么我希望您可以使用指向成员的模板参数 你想在这里实现的目标。以下自包含且经过测试的示例,虽然没有 v8,但应该演示如何做到这一点:

#include <iostream>

struct foo {
void bar(int arg) {
std::cout << "bar(" << arg << ") called" << std::endl;
}
};

template<class T, void (T::*fun)(int)>
void ptfWrapup(void* ptr, int arg) {
(static_cast<T*>(ptr)->*fun)(arg);
}

int main() {
foo f;
ptfWrapup<foo, &foo::bar>(&f, 42);
}

适用于您的情况,并假设 NumberType 是该 NumberValue 调用的返回值,或者更重要的是您想要的函数的第一个参数的类型调用,它看起来像这样:

template <class T, void (T::*fun)(NumberType)>
v8::Handle<v8::Value> jsFunctionTemplate(const v8::Arguments &args)
{
T *t = static_cast<T*>(args.This()->GetPointerFromInternalField(0));
if (t != NULL) (t->*fun)(args[0]->NumberValue());
return args.This();
}

… v8::FunctionTemplate::New(&jsFunctionTemplate<Audio, &Audio::volume>) …

与上面的示例相比,此处未经测试,但另一方面更接近您的代码。我希望,他们应该一起使这个想法变得清晰。

关于c++ - 将类的成员函数传递给回调函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11595622/

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