2011-10-25 43 views
0

你將如何實現多播TR1函子?我有我的回調插槽像TR1函數多播

void setCallback(std::tr1::function<void (std::string)> cb) 
{ 
    this->callback = cb; 
} 

但需要在其中一個回傳多個回調。我不想像觀察者那樣進入更復雜的解決方案,因爲這是我目前需要組播的唯一情況。我也無法使用Boost.Signals(如建議here),因爲我無法使用Boost。當用戶不再存在時,我不需要明確處理禁用回調。

回答

3

您很可能希望:

void registerCallback(std::tr1::function<void (std::string)> cb) 
{ 
    this->callbacks.push_back(cb); 
} 

std::tr1::function對象,而不是單一的一個callbacks容器(無論你喜歡)。調度時,迭代回調。

另外,如果你希望能夠在以後進行刪除回調,你可以做一些沿着這些路線:

// I use list because I don't want the iterators to be invalid 
// after I add/remove elements 
std::list<std::function<void(std::string)>> callbacks; 

... 
typedef std::list<std::function<void(std::string)>>::iterator callback_id; 

callback_id register_callback(std::function<void(std::string)> f) 
{ 
    return callbacks.insert(callbacks.end(), f); 
} 

void unregister_callback(callback_id id) 
{ 
    callbacks.erase(id); 
} 
0

有一個序列而不是一個單一的功能(即一個vector<...>),當回調時,迭代序列並調用。

e.g

std::vector<std::tr1::function<void (std::string)> > callbacks; 
auto it = callbacks.begin(), end = callbacks.end(); 
for(; it != end; ++it) 
    (*it)("somestring"); 
0

把它們放在一個列表/向量。如果你必須單獨刪除它們,你必須包裝一些方法(因爲它們沒有可比性)。

相關問題