我创建了这个函子Functions,它打算存储许多std::functions,并依次调用它们,就好像它是std::function本身一样:typedef std::function <void (int)> FuncType;struct Functions{ vector<FuncType> m; void operator+= (FuncType f) { m.push_back(f); } void operator() (int param ){ // same prototype as FuncType vector<FuncType>::iterator it; for(it=m.begin(); it!=m.end(); ++it) { (*it)(param); } }};它非常有用,因为它可以存储在FuncType中:int main(){ Functions f; f += foo; f += bar; FuncType ptr(f); ptr(10); // calls foo(10), then bar(10)}它工作正常,但我希望能够使它成为模板函子。但是我想不出一种使operator()遵循函数原型(prototype)的方法:template <typename FuncType> // for any Function typestruct Functions{ vector<FuncType> m; void operator+= (FuncType f) { m.push_back(f); } void operator() (...) { // how do I get the same prototype as FuncType? vector<FuncType>::iterator it; for(it=m.begin(); it!=m.end(); ++it) { (*it)(...); } }};理想情况下,我还希望有一个辅助函数,该函数可实例化仿函数(当然,所有函数都具有相同的原型(prototype)),如下所示:template <typename T>Functions<T> make_functions( T funcA, T funcB ) { Functions<T> f; f += funcA; f += funcB; return f;}但是我不确定编译器是否可以推断T是某种std::function 。我正在使用std::tr1 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 template<typename Sig> struct Functions;template<typename R, typename... Args>struct Functions<R(Args...)>{ typedef std::function<R(Args...)> FuncType; std::vector<FuncType> fs; void operator+=(FuncType f){fs.emplace_back(std::move(f));} template<typename...Us> void operator()(Us&&...us){ for(auto&&f:fs) f(us...); }};int main(){ Functions<void(int)> funcs; funcs += [](int x){ std::cout<<x<<"\n";}; funcs(7);}真正完美的转发和收集返回值作为练习。 (adsbygoogle = window.adsbygoogle || []).push({});
10-04 14:39