我已宣布全局类型:
typedef void ( MyClass::*FunctionPtr ) ( std::string );
然后我需要在我的函数中使用它:
void MyClass::testFunc() {
}
void MyClass::myFunction() {
std::map < std::string, FunctionPtr > ptrsMap;
ptrsMap[ "first" ] = &MyClass::testFunc;
std::map < std::string, FunctionPtr >::iterator it;
it = ptrsMap.begin();
( *it->second ) ( "param" ); // How to call this function?
}
问题是使用std :: map的迭代器通过指针调用函数。如何调用该功能?
如果我宣布&#34;它&#34;我认为一切都会好起来的。作为一个全局变量,并像这样调用smth:
( this->*it->second ) ( "param" );
但我需要使用局部变量调用该函数。
答案 0 :(得分:2)
FunctionPtr
是一个成员函数指针,因此需要在对象上调用它。
使用指向成员的绑定操作符.*
:
MyClass object;
...
(object.*it->second)("param")
答案 1 :(得分:2)
成员函数需要与实例关联。
MyClass k;
(k.*it->second)("param");
或者您可以使用当前对象
(*this.*it->second)("param");
此外,您的testFunc
需要使用字符串参数。
答案 2 :(得分:0)
问题是成员函数需要应用对象。
一种方法是使用函数对象:
auto f = std::bind(it->second, this, std::placeholders::_1); // first bind is for object
f (std::string("param")); // How to call this function?
顺便说一句,在您的代码示例中,您应该将测试函数的签名更正为:
void MyClass::testFunc(std::string) // FunctionPtr requires a string argument