Как я могу легко перенаправить метод Base в идентичный метод класса Derived? - PullRequest
0 голосов
/ 04 апреля 2019

При работе с платформой (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 и пример, который расширяет класс шаблона. Объявления методов и определения методов находятся внутри TExample (однако методы зарегистрированы в Примере).

Итак, когда я делаю:

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 ]

2 голосов
/ 04 апреля 2019

Не уверен, что вы подразумеваете под ", это не получается ".

Это просто работает, смотри ( live демо ):

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 голосов
/ 04 апреля 2019

А как насчет использования лямбды?

Работает:

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

работает?

(если obj содержит фактический метод, но его можно заменить налюбой экземпляр, содержащий метод).

0 голосов
/ 04 апреля 2019

Поскольку классы шаблонов будут создаваться для используемых вами типов, вы должны также упомянуть тип.

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