std::function<void()> v;
,我想v()
打印
1
2
std::function<void()> v;
,我想v()
打印
1
2
std::function
對目標的定義是const T* target() const
,這意味着它只能存儲一個t ARGET。
This question has been asked before,您所描述的情況在事件處理程序的上下文中稱爲CLR/.NET中的「委託多點傳送」。
有幾個可能的解決方案:
第一種方法是使用lambda或其他功能來定義手動組播:
function<void()> v = []() {
foo();
bar();
};
v();
第二是定義自己的全std::function
-esque支持可變數量的目標。您可以使用template
陣列(因此避免運行時使用vector
),或者只是使用vector
。
第三種選擇是簡單地包裹vector
反正(警告:pseudocodeish):
template<class FuncType>
class MulticastFunction {
private:
vector<std::function<FuncType>> targets;
public:
void operator()() {
for(auto& target : this->targets) {
target();
}
}
void addTarget(FuncType& target) {
this->targets->push_back(target);
}
}
用法:
MulticastFunction<void()> mc;
mc.addTarget(foo);
mc.addTarget(bar);
mc();
您可能希望'target'是通過value或const ref引用的,因此它可以綁定到lambda表達式 –
使用lambda?你的問題是什麼? – hyde
@hyde這樣就是'[](){foo(); bar();}'對嗎? – Julian
如果返回類型是* not *'void',你會期望什麼? – o11c