Wednesday, 15 July 2015

c++ - Trying to get std::function work with void* parameter -



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