Как позвонить через указатель на функцию-член?

Я пытаюсь сделать некоторое тестирование с указателем на функцию-член. Что не так с этим кодом? 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);

Что вы получаете: унифицированный синтаксис вызова практически для всего, что можно вызвать.

Накладные расходы: нет.

Другие вопросы по тегам