使用一个框架(Godot),使用register_method(<name>, <pointer_to_method>)
将c ++方法注册到脚本API。但是,此方法不支持指向模板类的指针。
所以在这个例子中:
static void _register_methods() {
register_method("my_method", &TMyClass::my_method); // this fails
// ^ template class
register_method("my_method", &MyClass::my_method); // this works
// ^ normal class
}
我有一个模板类TExample和一个扩展模板类的Example。方法声明和方法定义都在TExample内(但是方法在Example中注册)。
所以当我这样做时:
register_method("my_method", &Example::my_method); // this fails because it is referencing the method of the parent class (template).
我发现有效的方法是将方法重定向到“本地”方法。
class Example : TExample<...>
{
public:
void my_method() {
TExample::my_method();
}
static void _register_methods() {
register_method("my_method", &Example::my_method); // this works
}
}
但是想象一下,每次我想从我需要重定向50个方法的模板创建一个新类时,我有50个方法。有这样做的捷径吗?!
不确定你的意思是“失败”。
它只是工作,看(live demo):
template<class T>
class TExample {
public:
void my_method() {}
};
class Example : TExample<int> {
template<class U>
static void register_method(U u) {
}
public:
static void register_methods() {
register_method(&Example::my_method); // it works
register_method(&TExample::my_method); // this also works
}
};
int main()
{
Example ex;
ex.register_methods();
}
现在,如果您想从课外访问my_method()
,那么您应该公开继承:
class Example : public TExample<...>
{
然后Example::my_method()
也将在外面工作。
注意:TExample
不是模板类,而是类模板。但是,在模板实例化的上下文中(在Example
的定义内),模板参数会自动替换。
由于将为您使用的类型创建模板类,因此您也应该提及类型。
register_method("my_method", &TMyClass<Type>::my_method);
用lambda怎么样?
请问:
register_method("my_method", [&obj](*whateverParam*) { obj.templateMethod(*whateverParam*); } );
工作?
(假设obj
包含实际方法,但可以由包含该方法的任何实例替换)。