Рассмотрим пример:
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
чтобы разрешить передачу указателей базовой функции вместе со ссылкой на производный объект.
Есть ли лучший способ сделать это?Является ли вышеприведенное безопасным в том смысле, что оно либо не будет компилироваться, либо будет работать правильно?