如果我有两个功能
void foo()
{
std::cout << 1 << std::endl;
}
void bar()
{
std::cout << 2 << std::endl;
}
我有一个函数指针
std::function<void()> v;
我希望v()
打印
1
2
答案 0 :(得分:5)
std::function
对目标的定义是const T* target() const
,这意味着它只能存储一个目标。
This question has been asked before,您所描述的情况在事件处理程序的上下文中称为CLR / .NET中的“委托多播”。
有几种可能的解决方案:
第一种是使用lambda或其他函数手动定义多播:
function<void()> v = []() {
foo();
bar();
};
v();
第二个是定义你自己的完整std::function
- esque,它支持可变数量的目标。您可以使用template
数组执行此操作(从而避免运行时使用vector
)...或者只使用vector
。
第三个选项是简单地包装vector
(警告:伪代码):
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();