Как вызвать функцию указателя на член, сохраненную в контейнере? - PullRequest
3 голосов
/ 12 ноября 2019

Я пытаюсь написать функцию-член, которая по очереди вызывает другие функции-члены того же объекта, пока одна из них не заработает.

Я хотел бы написать это следующим образом:

class myClass
{
   bool A() { return false; }
   bool B() { return false; }
   bool C() { return false; }
   bool D() { return false; }
   void doIt() 
   {
      const QList<bool (myClass::*) ()> funcs({
                      &myClass::A, &myClass::B, &myClass::C, &myClass::D
         });

      bool result(false);
      for (auto iter = funcs.cbegin(); !result && iter != funcs.cend(); ++iter) 
      {
         result = this->(*iter) ();
      }
   }
};

Но я не могу получить правильный синтаксис для вызова моей функции через итератор. qt-creator отображает ошибку

called object type 'bool (myClass::*)()' is not a function or function pointer

, указывающую на вторую открывающую скобку, и g ++ сообщает

must use .* or ->* to call pointer-to-member function

, указывающую на вторую закрывающую скобку, обе в строке, где я назначаю результатв функции члена DoIt. (Обратите внимание, что примеры операторов в сообщении об ошибке g ++ заключены в серьезные акценты, но разметка удаляет «*», если я их включаю.)

Я могу найти любое количество примеров того, как вызывать указателидля функций-членов, но ничего с этой комбинацией сохранения указателей на функцию-член в коллекции и вызова в this

Ответы [ 2 ]

3 голосов
/ 12 ноября 2019

В дополнение к ответу @ 1201ProgramAlar m, если у вас есть доступ к компилятору , вы можете избежать странного синтаксиса, используяstd::invoke из заголовка <functional>.

#include <functional> // std::invoke

result = std::invoke(*iter, this);
3 голосов
/ 12 ноября 2019

Из-за приоритетной привязки для оператора () вам нужно добавить еще несколько символов:

result = (this->*(*iter))();
...