繁体   English   中英

如何使用std :: bind将成员回调添加到Messenger系统

[英]How to use std::bind for adding member callback to a messenger system

我目前正在尝试为我的游戏引擎实现Messenger系统。 它使用以下形式的函数回调:

typedef std::function<void(const Message &)> Callback;

我希望所有对象都能够订阅特定类型的消息(该类型只是一个字符串)。 订阅意味着将其“ onEvent”功能添加到回调字典中。

mutable std::map<std::string, std::vector<Callback>> callbackDictionary;

然后,更新函数将调用这些函数并传递相应的消息(“ onEvent”函数可从中获取其数据)

for each (auto message in messageList)
{
    // find the list of respective callbacks
    auto it = callbackDictionary.find(message->GetType());

    // If there are callbacks registered for this message type
    if (it != callbackDictionary.end())
    {
        // call every registred callback with the appropreate message
        for each (auto callback in it->second)
            callback(*message);
    }
}

现在,我的问题是我不太确定如何绑定这些“ onEvent”功能。 我最近刚切换到C ++ 11,函数对象和std::bind的概念对我来说还是很新的。 所以这是我尝试过的:

messageBus.Subscribe("Message/Click",std::bind(&ClickableComponent::OnClick, this));

其中ClickableComponent::OnClick函数具有必需的签名:

void OnClick(const Message &);

而Subscribe函数只是将传递的函数添加到字典中

void Messenger::Subscribe(std::string type, Callback callbackFunction) const
{
    callbackDictionary[type].push_back(callbackFunction);
}

(使用push_back是因为每种类型都有一个回调向量)

该代码对我来说似乎很好,但代码行:

messageBus.Subscribe("Message/Click", std::bind(&ClickableComponent::OnClick, this));

给我错误:错误说明的图片

我尝试了各种方法,例如转发Messenger参考和使用占位符,但是我感觉自己在做其他错误。 此外,赞赏有关如何实现此Messenger系统的更好的主意^^

谢谢你的帮助!

std::bind在您的情况下不是必需的,lambda函数就可以了:

messageBus.Subscribe("Message/Click", [this](const Message& msg) { OnClick(msg); });

std::bind在元编程的特定情况下更有用。

但是,如果您有足够的好奇心,可以看看如何使用std::bind

messageBus.Subscribe("Message/Click", 
    std::bind(&ClickableComponent::OnClick, this, std::placeholders::_1));

如您所见,在这里您错过了std::placeholders::_1 您的函子签名是void(const Message&) ,但是您尝试存储一个成员函数,该签名可以被视为void(ClickableComponent*, const Message&) 要部分应用某些参数( std::bind作用),您需要指定要绑定的参数和未绑定的参数。

Lambda是首选,因为通常它更短,更灵活且更具可读性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM