[英]boost::bind & boost::function pointers to overloaded or templated member functions
我有一個回調機制,涉及的類是:
class App
{
void onEvent(const MyEvent& event);
void onEvent(const MyOtherEvent& event);
Connector connect;
}
class Connector
{
template <class T> void Subscribe(boost::function <void (const T&)> callback);
}
App::App()
{
connect.Subscribe<MyEvent>(&App::OnEvent<MyEvent>);
}
首先這個代碼不能編譯,這是一個例子。
模板的使用使我的例子變得復雜,但是我把它們留下了,因為它影響了我的問題。 我似乎確定我的訂閱需要模板化,因為Connector類不知道它處理了多少事件類型。 當我嘗試創建一個:
boost::function f = &App::OnEvent,
我嘗試使用特化創建OnEvent作為模板函數,但似乎編譯器將我的OnEvent函數視為重載而不是模板特化,否則如果我嘗試將其明確聲明為,則不會在命名空間錯誤中獲取模板特化
template <> OnEvent(const MyEvent& e) ...
我可以得到以下代碼來編譯:
boost::function <void (App*, const MyEvent&)> f = &App::OnEvent;
f(this, e);
編譯,運行和工作。
boost::function<void (const MyEvent&)> g = boost::bind(&App::OnEvent, this);
才不是。 我認為是因為我沒有正確指定重載函數的地址。
現在已經向泰迪熊解釋了這一切 - 我認為我的問題是“如何正確創建一個指向重載或模板化成員函數的函數指針並將此指針綁定到它?”
我認為你需要消除重載函數的地址歧義。 您可以通過將函數指針顯式地轉換為具有正確參數的函數指針來完成此操作。
boost::bind( static_cast<void (App::*)( MyEvent& )>(&App::OnEvent) , this, _1);
你想要做的
boost::function<void (const MyEvent&)> g = boost::bind(&App::OnEvent, this, _1);
你應該能夠做g(事件); 接着就,隨即
我不太確定你在這里想要完成什么,但是現在應該解決你的一個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.