我正在研究可变参数模板,我想知道我是否可以做这样的事情:我会用一次调用调用任意数量的函数(任意返回类型(,具有任意数量和类型的参数。我能够使用的代码是这样的:
call(f1,f2,f3, 2.2,3);
call(f4,f5, 2.2, "Hello", 'a');
显然,如果传递的函数可以接受传递的参数。 我编写了一个版本,该版本可以使用要传递给函数的固定数量的参数:
template<typename T, typename U>
void fcall(const T& t1, const T& t2, U&& u){
u(t1, t2);
}
template<typename... F, typename T, typename U>
void fcall(const T& t1, const T& t2, U&& u, F&&... f){
u(t1, t2);
fcall(t1, t2, f...);
}
即使我不喜欢在函数之前传递参数,它也可以工作。
这是我写的,这不起作用:
template<typename P, typename U>
void fcall2(U&& f, const P& param){
f(param);
}
template<typename... P, typename... F, typename U>
void fcall2(U&& f, F&&... func, const P&... param){
f(param...);
fcall2(func..., param...);
}
我知道没用,只是好奇。 有什么建议吗?
你只能有一个这样的包。
从理论上讲,您可以在包中找到唯一的拆分点,该分割点允许在使用愚蠢复杂的模板元编程后用元素调用所有元素。
更容易的是写:
template<class...Fs>
auto call_all(Fs...fs){
return [&](auto&&...args){
(void(fs(args...)),...);
};
}
(C++17(。
用于:
call_all(f1,f2,f3)(3.13, "hello");