在c++中循环遍历函数的所有参数

looping over all arguments of a function in C++

本文关键字:参数 函数 遍历 c++ 循环      更新时间:2023-10-16

我想对函数的一堆参数做相同的处理。有没有办法循环遍历所有参数?我是按照下面代码中的方式来做的,但我想看看是否有一种紧凑的方法来做到这一点。

 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作为参数。可能比使用可变路径

要简单得多