如何将成员函数作为参数传递?

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 的成员函数作为参数传递给另一个成员函数?

将成员函数作为委托参数传递

将成员函数作为参数传递/c++

C ++:将成员函数作为普通函数指针传递的闭包

C++ CreateThread函数如何传递this指针作为参数

如何实现类的成员函数作为回调函数