如何将成员函数作为参数传递?
Posted
技术标签:
【中文标题】如何将成员函数作为参数传递?【英文标题】:How to pass a member function as an argument? 【发布时间】:2019-10-28 03:02:27 【问题描述】:我有以下课程:
typedef void (*ScriptFunction)(void);
typedef std::unordered_map<std::string, std::vector<ScriptFunction>> Script_map;
class EventManager
public:
Script_map subscriptions;
void subscribe(std::string event_type, ScriptFunction handler);
void publish(std::string event);
;
class DataStorage
std::vector<std::string> data;
public:
EventManager &em;
DataStorage(EventManager& em);
void load(std::string);
void produce_words();
;
DataStorage::DataStorage(EventManager& em) : em(em)
this->em.subscribe("load", this->load);
;
我希望能够将 DataStorage::load 传递给 EventManager::subscribe,以便稍后调用它。我如何在 C++ 中实现这一点?
【问题讨论】:
函数指针和成员函数指针之间有一个difference。您想要做的事情包含在各种callback 问题中。 【参考方案1】:最好的方法是使用std::function
:
#include <functional>
typedef std::function<void(std::string)> myFunction;
// Actually, you could and technically probably should use "using" here, but just to follow
// your formatting here
然后,要接受一个函数,你只需要做和以前一样的事情:
void subscribe(std::string event_type, myFunction handler);
// btw: could just as easily be called ScriptFunction I suppose
现在是棘手的部分;要传递成员函数,您实际上需要将bind 的一个实例DataStorage
传递给成员函数。看起来像这样:
DataStorage myDataStorage;
EventManager manager;
manager.subscribe("some event type", std::bind(&DataStorage::load, &myDataStorage));
或者,如果你在 DataStorage
的成员函数中:
manager.subscribe("some event type", std::bind(&DataStorage::load, this));
【讨论】:
谢谢。修复了 typedef。我有时会混淆。 另外,关于 lambda 的要点。自己创建一个答案可能是值得的。否则我会因此而获得荣誉。以上是关于如何将成员函数作为参数传递?的主要内容,如果未能解决你的问题,请参考以下文章
如何将带有 args 的成员函数作为参数传递给另一个成员函数?