c++ - Trying to get std::function work with void* parameter -
i trying generic messenger callback class implemented. map of string vector of generic fellow member functions.
std::map<message, std::vector<std::function<void()>>> _receivers; the class has static functions allows register enum message fellow member function this:
messenger::getinstance()->registerobserver(message::quit, std::bind(&system::onquit, this)); then whenever message broadcast somewhere, callback happens.
messenger::getinstance()->broadcast(message::quit); the implementation follows.
class messenger { public: template <typename receiver> void registerobserver(message msg, receiver&& receiver) { _receivers[msg].push_back(std::forward<receiver>(receiver)); } static messenger* getinstance(); void broadcast(message msg) const { (const auto& obs : _receivers.at(msg)) obs(); } void broadcast(message msg, void* param) const; { (const auto& obs : _receivers.at(msg)) obs(param); // not work } ~messenger(); private: messenger() { }; std::map<message, std::vector<std::function<void()>>> _receivers; static messenger* _instance; }; the implementation works no parameters.
now need work void* parameter can pass along broadcast if need gets called in callback.
this want achieve.
messenger::getinstance()->broadcast(message::quit, *param); any advice or solution appreciated. help me maintain design sane.
i tried changing map --
std::map<message, std::list<std::function<void(void*)>>> _receivers; and changing phone call signatures void callbackname(void* param). error
error c2064: term not evaluate function taking 1 arguments probably because of this:
messenger::getinstance()->registerobserver(message::quit, std::bind(&system::onquit, this));
you may create 2 maps, , utilize 2 register methods. if want same name, may utilize sfinae following: live example
class messenger { public: template <typename receiver> auto registerobserver(message msg, receiver&& receiver) -> decltype(receiver(), void()) { _receivers0[msg].push_back(std::forward<receiver>(receiver)); } template <typename receiver> auto registerobserver(message msg, receiver&& receiver) -> decltype(receiver(nullptr), void()) { _receivers1[msg].push_back(std::forward<receiver>(receiver)); } // others methods private: std::map<message, std::vector<std::function<void()>>> _receivers0; std::map<message, std::vector<std::function<void(void*)>>> _receivers1; }; c++
No comments:
Post a Comment