簡體   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