如何轻松地将Base方法重定向到相同的Derived类方法?

时间:2019-04-04 14:17:48

标签: c++ templates member-function-pointers godot

在与使用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种方法。有捷径吗?!

3 个答案:

答案 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包含实际方法,但是可以用任何包含该方法的实例代替)。