在c++中循环遍历函数的所有参数
looping over all arguments of a function in C++
我想对函数的一堆参数做相同的处理。有没有办法循环遍历所有参数?我是按照下面代码中的方式来做的,但我想看看是否有一种紧凑的方法来做到这一点。
void methodA(int a1, int a2, int b1, double b2){
//.. some code
methodB(a1, f(a1));
methodB(a2, f(a2));
methodB(b1, f(b1));
methodB(b2, f(b2));
// more code follows ...
}
int f(int a){
// some function.
return a*10;
}
double f(double b){
return b/2.0;
}
您可以使用可变模板:
template <typename T, typename ...Args>
void methodAHelper(T && t, Args &&... args)
{
methodB(t, f(t));
methodAHelper(std::forward<Args>(args)...);
}
void methodAHelper() { }
template <typename ...Args>
void methodA(Args &&... args)
{
// some code
methodAHelper(std::forward<Args>(args)...);
// some other code
}
你可以摆脱&&
和转发,如果你知道你的methodB
调用不知道右值引用,这将使代码更简单一点(你有const Args &...
代替),例如:
methodAHelper(const T & t, const Args &... args)
{
methodB(t, f(t));
methodAHelper(args...);
}
您还可以考虑更改methodB
:由于第二个参数是第一个参数的函数,因此您可能只能传递第一个参数并在 methodB()
中执行对f()
的调用。这减少了耦合和相互依赖;例如,f
的整个声明只需要为methodB
的实现所知。但那要看你的实际情况。
或者,如果只有一个methodB
的重载,其第一个参数是T
类型,那么您可以将std::vector<T>
传递给methodA
并迭代它:
void methodA(const std::vector<T> & v)
{
// some code
for (auto it = v.cbegin(), end = v.cend(); it != end; ++it)
methodB(*it, f(*it));
// some more code
}
int main() { methodA(std::vector<int>{1,2,3,4}); }
是的,你正在寻找的概念被称为可变函数
取决于你想做什么。最简单的方法可能是重新访问函数,看看它是否可以接受数组或std::vector作为参数。可能比使用可变路径
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类