[英]c++ find() for map of member function
我有两个继承类。 我想允许类将它们的功能存储在一个地图中。 如何通过密钥创建查找功能? 并且函数的继承是否有效(MyClass_2没有自己的doSmth()函数,它应该从MyClass添加doSmth())? 我的尝试如下:
template<class T>
class Class1
{
typedef void(T::*MyFunction)();
map<string, MyFunction> functionMap;
public:
void addFunc(string funcName, MyFunction function) {
functionMap.insert(pair<string, MyFunction>(funcName, function));
}
bool findFunc(string key) {
typename map<string, MyFunction>::iterator it;
it = functionMap.find(key.c_str());
}
};
class MyClass {
Class1<MyClass> class1;
void addFunc() {
class1.addFunc("Func1", &MyClass::doSmth);
}
void findAndCallFunc(string key) {
class1.findFunc(key);
}
void doSmth();
};
class MyClass_2: MyClass {
Class1<MyClass_2> class1;
void addFunc() {
class1.addFunc("Func1", &MyClass_2::doSmth);
}
}
编辑:我测试了我的程序。 有用。 我的问题是,如果我从MyClass_2的对象调用fundAndCallFunc。 它不是MyClass_2的class1,而是MyClass的class1。 我应该改变什么?
你有两个明显的问题:
你的findFunc
方法只是查找函数,它不会对它做任何事情(尝试调用它或返回方法指针),并将其声明为返回bool
而不是MyFunction
- 不确定你想要它做什么
您的doSmth
方法在MyClass中是私有的,因此您无法在MyClass_2中访问它。 您需要将其保护或公开。
正如Chris所说,你的findFunc
应该返回实际的函数:
MyFunction findFunc(string key)
{
const map<string, MyFunction>::const_iterator it = functionMap.find(key);
return it == functionMap.end() ? NULL : it->second;
}
此外,如果您只将函数指针存储到成员函数,则会丢失对实际对象的跟踪(因此您可以将地图设置为静态!)。 也许您还应该存储对象的this
指针,即使您的地图如下:
std::map<std::string, std::pair<T*, MyFunction> > functionMap;
在addFunc
你会说
functionMap.insert(std::make_pair(funcName, std::make_pair(this, function)));
用法:假设it = functionMap.find("key")
。 然后你可以说:
MyClass * const p = it->second.first;
MyFunction f = it->second.second;
p->*f(); // invoke -- yes, it's operator->*() in action
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.