簡體   English   中英

循環遍歷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調用不知道rvalue引用,你可以擺脫&&和轉發,這將使代碼更簡單(你有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>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作為參數。 采用可變路線可能要簡單得多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM