好吧,我已經有這個作爲一個工作的例子,但我只是想清理它。使用函數調用內部的綁定
目前我有一個訂閱風格的事件系統與回調例程。
我在將常規函數和類成員函數添加到存儲變量中沒有問題。
但id喜歡通過重載我的Event.subscribe方法來清理它。
目前,它做一些事情,像這樣:
template <class T>
class EventObject
{
public:
void subscribe(const T& arg)
{
this->events.push_back(arg);
}
std::vector<T> events;
}
,然後在我的主要的使用,像這樣:
void someCallback(const std::string& line)
{
cout <<line;
}
typedef std::function<void(const std::string& line)> onMessageCallbackFunction;
EventObject<onMessageCallbackFunction> messageCallback;
messageCallback.subscribe(someCallback);
現在泡菜挺身而出,當我使用一個類的成員函數。我討厭在傳遞它之前必須內在地綁定這個函數。它使代碼看起來很髒。
例如:
class B
{
void callbk(const std::string& line) {}
};
B b;
using std::placeholders::_1;
onMessageCallbackFunction memfunc = std::bind(&B::callbk, b, _1);
messageCallback.subscribe(memfunc);
現在推倒它的工作原理,但它看起來糟糕。什麼是語法,所以我可以只是瓶胚:
messageCallback.subscribe(&B::callbk, b);
試過幾個,但我似乎無法得到它只是正確的。
它是什麼並不:
template <class J>
void subscribe(J::T cls,T& t); //Nope.
void subscribe(J&& cls,T& t); //Nope.
超近距:(THX TOBI)
template< class J, class... Args >
void subscribe(void(J::*funct)(Args), J& inst) {
using std::placeholders::_1;
subscribe(std::bind(funct, inst, _1));
}
現在只需要一般的參數列表。
不知道,但我想我寧願lambdas綁定 – user463035818
你可以看到它是如何實現在std :: thread ctor(3) - http://en.cppreference.com/w/cpp/thread/thread/thread-它不是微不足道的,所以你更好地使用'std :: function' – Slava
@Slava那麼你會怎麼做呢? –