我该如何使以下代码正常工作?我不能将成员设置为静态的,父类不知道子类,而且我无法使用boost。我不使用虚函数的原因是Child类应该能够定义1-N个处理程序。
class Parent
{
public:
void registerFileHandler(string ext, memFuncPtr);
};
class Child : public Parent
{
Child()
{
registerFileHandler("jpg", &Child::loadJpg);
registerFileHandler("png", &Child::loadPNG);
}
void loadJpg(string filename);
void loadPNG(string filename);
};
编辑: 有许多答案,而对我来说最好的是使用关键词“erasure”,“std :: bind”和“std :: function”,当然这些都依赖于c ++ 11。 以下是一个完整可编译示例:
#include <string>
#include <map>
#include <iostream>
#include <functional>
using namespace std;
class Parent
{
public:
void load(string filename)
{
// See if we can find a handler based on the extension.
for(auto it = handlers.begin();it!=handlers.end();it++)
if(filename.substr(filename.size()-it->first.size(), it->first.size())==it->first)
it->second(filename);
}
template<typename Class>
void registerFileHandler(Class* p, void (Class::*func)(string), string ext)
{
using namespace std::placeholders; //for _1, _2, _3...
handlers[ext] = std::bind(func, p, _1);
}
private:
map<string, std::function<void(string)> > handlers;
};
class Child : public Parent
{
public:
Child()
{
registerFileHandler(this, &Child::loadJpg, "jpg");
registerFileHandler(this, &Child::loadPNG, "png");
}
void loadJpg(string filename)
{
cout << "loading the jpeg "<< filename << endl;
}
void loadPNG(string filename)
{
cout << "loading the png "<< filename << endl;
}
};
int main(int argc, char* argv[])
{
Child child;
child.load("blah.jpg");
child.load("blah.png");
return 0;
}
Child::loadJpg
不是静态的,你需要一个实际的Child
对象。那么Parent
如何知道要使用哪个呢?是dynamic_cast<Child*>(this)
吗? - MSalters