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

问题描述 投票:-1回答:3

使用一个框架(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个方法。有这样做的捷径吗?!

c++ templates member-function-pointers godot
3个回答
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的定义内),模板参数会自动替换。


0
投票

由于将为您使用的类型创建模板类,因此您也应该提及类型。

register_method("my_method", &TMyClass<Type>::my_method);

0
投票

用lambda怎么样?

请问:

register_method("my_method", [&obj](*whateverParam*) { obj.templateMethod(*whateverParam*); } );

工作?

(假设obj包含实际方法,但可以由包含该方法的任何实例替换)。

© www.soinside.com 2019 - 2024. All rights reserved.