如何通过保存在容器中的指向成员函数的指针来调用?

How to call through pointer-to-member function saved in a container?

我正在尝试编写一个成员函数,依次调用同一对象的其他成员函数,直到其中一个起作用。

我想这样写:

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

由于 () 运算符的优先级绑定,您需要添加更多括号:

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

除了 @1201ProgramAlarm 的答案,如果您可以从 <functional> header 访问 compiler, you could able to avoid the weird syntax, by using the std::invoke

#include <functional> // std::invoke

result = std::invoke(*iter, this);