Как позвонить через указатель на функцию-член?
Я пытаюсь сделать некоторое тестирование с указателем на функцию-член. Что не так с этим кодом? bigCat.*pcat();
утверждение не компилируется.
class cat {
public:
void walk() {
printf("cat is walking \n");
}
};
int main(){
cat bigCat;
void (cat::*pcat)();
pcat = &cat::walk;
bigCat.*pcat();
}
2 ответа
Решение
Требуется больше скобок:
(bigCat.*pcat)();
^ ^
Вызов функции (()
) имеет более высокий приоритет, чем оператор привязки указатель к члену (.*
). Унарные операторы имеют более высокий приоритет, чем бинарные операторы.
Сегодня каноническим способом является использование шаблона функции std :: invoke , особенно в универсальном коде. Обратите внимание, что сначала идет указатель на функцию-член:
import <functional>;
std::invoke(pcat, bigCat);
Что вы получаете: унифицированный синтаксис вызова практически для всего, что можно вызвать.
Накладные расходы: нет.