Как вызвать производный метод через указатель на функцию? - PullRequest
2 голосов
/ 24 мая 2019

Рассмотрим пример:

struct base {
    void method() {};
};

struct foo : base {};

template <typename T,typename R>
void call_it(T& t, R (T::*f)()) {
    (t.*f)();
}

template <typename T,typename B,typename R>
void call_it(T& t, R (B::*f)()) {
    (t.*f)();
}    

int main() {
    base b;
    call_it(b,&base::method);
    foo f;
    call_it(f,&foo::method);
}

Сначала я был немного удивлен, что &foo::method это void (base::*) (), а не void (foo::*)(), но потом я понял, что могу обеспечить вторую перегрузку дляcall_it чтобы разрешить передачу указателей базовой функции вместе со ссылкой на производный объект.

Есть ли лучший способ сделать это?Является ли вышеприведенное безопасным в том смысле, что оно либо не будет компилироваться, либо будет работать правильно?

1 Ответ

3 голосов
/ 24 мая 2019

Вы можете избавиться от первой перегрузки, поскольку более общая из них охватывает все варианты ее использования.

PS Похоже, что это (гораздо менее общая) повторная реализация std::invoke.Вы можете использовать это вместо этого, если у вас есть доступ к C ++ 17:

std::invoke(&foo::method, f);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...