问题描述
我想调用一个函数,每个参数都作为参数包传递。 我已经写了一个简单的模板函数:
template<class Function,class... Args>
auto for_each_arg(Function f,Args&&... args) {
(f(std::forward<Args>(args)),...);
}
void foo(int a) { }
for_each_arg(foo,1);
void bar(int a,int b) { }
for_each_arg(bar,1,2);
它给出了一个错误 too few arguments for call
。我怎么能修好呢?可以在 C++17 中创建解决方案。
解决方法
apply_foreach(f,tuples...)
这里调用者将参数打包成元组,我们将它们解包到调用中。这使得哪些参数的打包变得清晰。
我们可以将apply 调用移到foreach 函数中。理论上,我们 csn 检测目标是否接受 1 个参数,如果没有将参数解包为元组,但我建议不要这样做。像这样混乱的操作会导致很多事情出错。
String button = "//li[contains(@class,'_3nAZvQO51p N')]/a"
是一个干净且易于指定的函数。
,古老的递归方式很简单
#include <iostream>
template <typename F>
void invoke_two_args (F)
{ }
template <typename F,typename A0,typename A1,typename ... Args>
void invoke_two_args (F f,A0 && a0,A1 && a1,Args && ... args)
{
f(std::forward<A0>(a0),std::forward<A1>(a1));
invoke_two_args(f,std::forward<Args>(args)...);
}
void bar(int a,int b)
{ std::cout << "bar: " << a << ' ' << b << '\n'; }
int main ()
{
// compile
invoke_two_args(bar,2,3,5,7,11,13);
// compilation error: wrong number of arguments
// invoke_two_args(bar,13,17);
}
仅当参数列表不太长时,这是一个很好的解决方案。
,你可以这样使用:
template <typename F,typename... Args>
auto curry(F&& f,Args&&... args) {
if constexpr (std::is_invocable_v<F,Args...>) {
return std::invoke(std::forward<F>(f),std::forward<Args>(args)...);
} else {
return [&](auto&&... more_args) {
return curry(std::forward<F>(f),std::forward<Args>(args)...,more_args...);
};
}
}
int foo(int a,int b) { return a + b; }
// usage
auto func = curry(foo);
func(1)(2);