问题
我希望创建一个函数,它接受任意数量的仿函数对象或更一般地说只是可调用对象(不同类型)并将它们应用于内部数据结构。该函数将在我的代码中的不同点与不同数量的仿函数一起使用。
我考虑使用可变参数模板,而不是制作不同的版本来接受 1,2,3... 等和重复代码。
我找到了一个解决方案,我将在下面发布作为答案,因为我在 Google 上找不到任何关于此的具体内容,其他人可能会觉得它很有用。但是,如果有人有更好的想法,请发布它们。我觉得应该有一种标准的方法来做到这一点?
天真的尝试
我有点知道这行不通,但我的第一次尝试是
#include <iostream>
using namespace std;
struct FunctorA {
void operator() () {
cout << "FunctorA" << endl;
}
};
struct FunctorB {
void operator() () {
cout << "FunctorB" << endl;
}
};
template<typename... Fs>
void apply_functors(Fs... fs) {
fs()...; // will not work - can only expand packs in certain situations (e.g. as funciton
}
int main(void) {
apply_functors(FunctorA(),FunctorB());
apply_functors(FunctorA());
apply_functors([]()->void{ cout << "Lambda" << endl; });
return 0;
}
但是,这不起作用,因为我们只允许在某些情况下扩展参数包,并且像这样的免费不是一个。
尝试 2
我的下一个想法是创建一个虚拟函数,它什么都不做,但我可以将函子作为参数传递给它,然后让它们展开。这背后的原因是函数参数是我们可以扩展参数包的情况之一。
template<typename... Fs>
void _dummyF_impl(Fs... fs){}
template<typename... Fs>
void apply_functors(Fs... fs) {
_dummyF_impl( fs()... ); // only works if all functors return a value (else we get "invalid use of 'void'")
}
但是,这不起作用,因为仿函数从它们operator()
的 s 返回 void,我们不能将 void 作为参数传递给函数。