2012-07-21 99 views
0

我有这样的模板:将类的成员函数传递给回调函数?

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%动态的,所以我希望能取代t->volume用指针(STD ::的mem_fn?)。关键是,我无法从类似的例子/问题弄清楚如何留住jsFunctionTemplate的电流型(它必须是一个v8::InvocationCallback

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

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

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

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

回答

3

我并不完全了解其中的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>) … 

相较于上面的例子中,这这里是未经测试,但另一方面更接近你的代码。我希望,他们应该一起让这个想法变得清晰。

+0

先生,您是一位绅士和学者。 :d – 2012-07-22 01:42:19