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

时间:2011-11-04 12:56:10

标签: 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;
}

3 个答案:

答案 0 :(得分:5)

您可以使用可变参数模板:

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
}

如果你知道你的&&调用不知道rvalue引用,你可以摆脱methodB和转发,这将使代码更简单(你有例如const Args &...),例如:

methodAHelper(const T & t, const Args &... args)
{
  methodB(t, f(t));
  methodAHelper(args...);
}

您也可以考虑更改methodB:由于第二个参数是第一个参数的函数,您可能只能传递第一个参数并执行对f() 的调用 methodB()。这减少了耦合和相互依赖;例如,f的整个声明只需要知道methodB的实现。但这取决于你的实际情况。

或者,如果methodB只有一个重载,其第一个参数的类型为T,那么您可以将std::vector<T>传递给{{ 1}}并迭代它:

methodA

答案 1 :(得分:0)

是的,您正在寻找的概念称为variadic function

答案 2 :(得分:0)

取决于您要做的事情。最简单的事情可能是重新访问你的函数,看看它是否可以将数组或std :: vector作为参数。走可变路线可能要简单得多