在与使用register_method(<name>, <pointer_to_method>)
将c ++方法注册到脚本API的框架(Godot)一起使用时。
但是,此方法不支持指向模板类的指针。
因此在示例中:
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种方法。有捷径吗?!
答案 0 :(得分:2)
不确定“ 失败”是什么意思。
看起来不错,{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
的内部),模板参数将自动替换。
答案 1 :(得分:0)
由于将为您使用的类型创建模板类,因此您还应该提及类型。
register_method("my_method", &TMyClass<Type>::my_method);
答案 2 :(得分:0)
使用lambda怎么样?
是:
register_method("my_method", [&obj](*whateverParam*) { obj.templateMethod(*whateverParam*); } );
工作吗?
(假设obj
包含实际方法,但是可以用任何包含该方法的实例代替)。