【发布时间】:2019-12-12 05:45:59
【问题描述】:
我正在尝试通过成员函数 ptr 的映射调用成员函数 那是不同类的数据成员
{
class B
{
public:
typedef void (B::*funcp)(int);
B()
{
func.insert(make_pair("run",&B::run));
}
void run(int f);
map<string,funcp>func;
};
class A
{
public:
A();
void subscribe(B* b)
{
myMap["b"] = b;
}
map<string,B*>myMap;
void doSome()
{
myMap["place"]->func["run"](5);
}
};
int main()
{
A a;
B b;
a.subscribe(&b);
a.doSome();
return 0;
}
}
但我得到了
错误:必须使用'.'或'->'来调用指向成员函数的指针 '((A*)this)->A::myMap.std::map, B*>::operator[](std::basic_string(((const char*)"place"), std::allocator()))->B::func.std::map, void (B::)(int)>::operator[](std::basic_string(((const char)"run"), std::allocator())) (...)',例如'(...->* ((A*)this)->A::myMap.std::map, B*>::operator[](std::basic_string(((const char*)"place"), std::allocator()))->B::func.std::map, void (B::)(int)>::operator[](std::basic_string(((const char)"run"), std::allocator()))) (...)'
我也试过了:
{
auto p = myMap["place"];
(p->*func["run"])(5);
}
然后把它报错:
'func' 没有在这个范围内声明
【问题讨论】:
-
我建议您了解
std::function和lambdas(或者可能是std::bind),因为这样会让这样的事情更加更容易。 -
->*与->不同——右边的不是成员的名称,而是在当前范围内计算的表达式。
标签: c++ stdmap member-function-pointers