2010-08-11 6 views
0

필자는 필자의 함수에 모든 동적 인수를 반복해야합니다.C++ 함수에서 동적 인수를 루프하는 방법은 무엇입니까?

void something(int setting1, int setting2, ...){ 
    // loop somehow all the ... arguments and use setting1-2 values in that loop 
} 

설정 1과 설정 2 동적 인수 목록의 일부가 아닌 :

나는 이러한 종류의 코드를 의미한다.

+2

그들이 왜 배열로 모두의 int 통과하지 않기 때문에? –

+0

나는 여전히 동적 인 매개 변수를 취하는 함수를 만들어야 만한다. – Newbie

답변

2

사용 va_ 기능. 다음은 그 예입니다 :

void PrintFloats (int amount, ...) 
{ 
    int i; 
    double val; 
    printf ("Floats passed: "); 
    va_list vl; 
    va_start(vl,amount); 
    for (i=0;i<amount;i++) 
    { 
     val=va_arg(vl,double); 
     printf ("\t%.2f",val); 
    } 
    va_end(vl); 
    printf ("\n"); 
} 

다른 인수는 다른 arg가 몇 개 있는지 표시해야합니다. 예를 들어, printf는 형식 문자열의 백분율을 사용하여이를 수행합니다. 내 예제에서는 첫 번째 인수를 사용합니다.

그리고 이런 종류의 인자 전달이 벌침이라고 생각하지 않도록 varargs are bad, m'kay을 꼭 읽으십시오. 이처럼

+0

OH 쓰레기 ... 그렇다면이 방법을 사용할 수 없습니다. > _> – Newbie

+0

코드의 일부를 반복하는 템플릿 함수를 생성하는 것이 가능합니까? 그래서 나는 각 양의 인수에 대한 코드를 생성 할 수 있습니다. – Newbie

0

가변 인수를 데이터 구조 (목록, 배열 등)로 추출하고 해당 구조에 setting1/setting2을 추가 할 수도 있습니다.

는 그런 구조의 요소 :

+0

어떻게 동적 인 구조를 만들 수 있는가 ...? – Newbie

+0

대괄호'[]'를 사용하여 배열을 만들 수 있지만 배열에 몇 개의 요소가 있는지 (최대 크기가 충분한 지) 알아야하는 고정 된 크기입니다. –

+0

그래, 그리고 인수를 사용하기 전에 내 손가락으로 계산하고 싶지 않다 ... – Newbie

1

This MSDN article의 모든 것을 단지 루프는 설명과 적절한 예제가 포함되어 있습니다.

참고 : 전체적으로 va_arg 사업은 안전하지 않으며, 다른 모든 인수가 동일한 유형 인 경우 제안 된 다른 모든 인수는 컨테이너에 모두 넣어두고 대신 전달합니다.

예컨대 :

void func(int arg1, int arg2, std::vector<float> &myFloats) 
{ 
    // myFloats can be used here, and you know how many floats there are 
    // by calling myFloats.size() 
} 
+0

하지만 func (0, 1, 4, 5, 1, 4) 또는 func (0, 1, {4, 5, 1, 4}) 등은 좋지 않습니다. list.push_back (4); list.push_back (5); list.push_back (1); list.push_back (4); func (0, 1, list); : D – Newbie

+0

@ 새내기 : 같은 유형의 논쟁인가, 그렇지 않은가? 그리고 비밀이 아니라면 무엇을 할 계획입니까? – Dmitry

+0

동적 2 차원 어레이 크기를 확인하는 중, 너무 작 으면 실행을 거부하고 함수를 종료하고 오류를 푸시합니다. 지금까지이 코드를 반복하는 것은 잘 작동하는 것처럼 보입니다. 단지 하나의 함수로 묶어서 느리게 만드는 것이 좋을 것 같습니다 ... – Newbie

1

:


#include <stdarg.h> 

void Foo(int s1, int count, ...) 
{ 
     va_list args; 

     va_start(args, count); 

     if (count > 0) { 
      // Do something with the first variable, assuming it's std::string... 
      std::string v1(va_arg(args, std::string)); 

      for (unsigned int i = 0; i < count - 1; ++i) 
        std::cout << va_arg(args, std::string) << "|"; 
     } 

     va_end(args); 
} 
관련 문제