我正在尝试编写一些用于将类包装到JavaScript中的模板。基本上它是通过SetAccessor ()
指定访问者的名称和必须调用的成员函数来完成的。我创造了这样的东西:
template <typename Ret, typename T>
void mbind (const char* name, Ret (T::*method)())
{
...
objectTemplate->SetAccessor (String::NewSymbol(name),get_value<Ret,T>);
...
}
这是get_value
的当前定义:
template <typename Ret, typename T>
Handle<Value> get_value (Local<String> name, const AccessorInfo& info)
{
...
}
我们的想法是以下列方式自动绑定函数:
mbind ("getX",&SomeClass::getX);
但是,如果我有两个这样的方法,这将不起作用:
int SomeClass::getX ();
int SomeClass::getY ();
因为Ret
和T
在两种情况下都相同。如何为这两种情况获取不同的模板实例?
提前致谢。
答案 0 :(得分:0)
您可以使用指向成员的指针作为附加模板参数(现在没时间测试代码,抱歉):
template <class Ret, class T, Ret (T::* method)()>
void mbind(const char* name)
{
.... get_value<Ret, T, method>() ...
}
template <typename Ret, typename T, Ret (T::* method)()>
Handle<Value> get_value (Local<String> name, const AccessorInfo& info)
{
....
}
mbind<int, SomeClass, &SomeClass::GetX>("GetX");
似乎我有更多时间:以下是更好一点我想因为它会允许任何类型的参数并减少参数的数量:
template <class MethodT, MethodT method>
void mbind(const char* name)
{
.... get_value<MethodT, method>() ....
}
template <class MethodT, MethodT method>
Handle<Value> get_value (Local<String> name, const AccessorInfo& info)
{
....
}
mbind<int (SomeClass::*)(), &SomeClass::GetX>("GetX");
答案 1 :(得分:0)
解决方案1:
template <typename Ret, typename T, Ret(T::*mptr)()>
Handle<Value> get_value (Local<String> name, const AccessorInfo& info)
{
...
}
template <typename Ret, typename T>
void mbind (const char* name, Ret (T::*mptr)())
{
....
objectTemplate->SetAccessor (String::NewSymbol (name),get_value<Ret,T,mptr>);
}
解决方案2:
template <typename M, M mptr>
Handle<Value> get_val (Local<String> name, const AccessorInfo& info)
{
...
}
template <typename Ret, typename T>
void register_get_mem_fun (const char* name, Ret(T::*mptr)())
{
v8::HandleScope localScope;
typedef Ret (T::*M)();
....
objectTemplate->SetAccessor (String::NewSymbol (name),get_val<M,mptr>);
}
在这两种情况下,错误基本相同:
wrapper.h:184:5: error: ‘mptr’ is not a valid template argument for type ‘int (Cell::*)()’
wrapper.h:184:5: error: it must be a pointer-to-member of the form `&X::Y'