我有这个模板:
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语法。
答案 0 :(得分:3)
我并未声称完全理解v8 API在此处施加的限制,但如果该类型的模板参数正确,那么我希望您可以使用指向成员的模板参数< / strong>为了你想在这里实现的目标。以下自包含且经过测试的示例虽然没有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>) …
与上面的示例相比,这里未经测试,但另一方面更接近您的代码。我希望他们能够一起使这个想法变得清晰。