gpt4 book ai didi

c++ - 在C++中将指向成员函数的指针传递给父级

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:53 25 4
gpt4 key购买 nike

如何使下面的代码工作?我不能让成员静态化,Parent 不知道 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);
};

编辑:有很多答案。最适合我的是使用关键字删除、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;
}

最佳答案

std::function怎么样?和 std::bind :

class Parent
{
public:

void registerFileHandler(string ext, const std::function<void(string)> &f)
{
}
};

class Child : public Parent
{
public:
Child()
{
using namespace std::placeholders; //for _1, _2, _3...
registerFileHandler("jpg", std::bind(&Child::loadJpg, this, _1));
registerFileHandler("png", std::bind(&Child::loadPNG, this, _1));
}

...

关于c++ - 在C++中将指向成员函数的指针传递给父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16210903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com