如何通过保存在容器中的指向成员函数的指针来调用?
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 访问 c++17 compiler, you could able to avoid the weird syntax, by using the std::invoke
。
#include <functional> // std::invoke
result = std::invoke(*iter, this);
我正在尝试编写一个成员函数,依次调用同一对象的其他成员函数,直到其中一个起作用。
我想这样写:
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 访问 c++17 compiler, you could able to avoid the weird syntax, by using the std::invoke
。
#include <functional> // std::invoke
result = std::invoke(*iter, this);