2009-07-20 5 views

답변

16

동일한 편리한 구문을 사용하여 관리되지 않는 C++의 경우,

그러나 C++에서 함수에 variable argument lists을 지원합니다.

기본적으로 마지막 매개 변수가 줄임표 (...) 인 함수를 선언하고 함수 본문 내에 va_start()/va_arg() 호출을 사용하여 제공된 매개 변수 목록을 구문 분석합니다.

이 메커니즘은 안전 입력되지 않으며, 발신자 아무것도 통과 할 수 있으므로 공용 함수의 인터페이스와 당신이 전달 될 것으로 기대를 문서화 명확하게해야한다.

관리 C++ 코드의 경우, 리드의 의견을 참조 .

19

예. 표준 C++에서는 va_arg 및 ... 구문을 사용할 수 있습니다. MSDN for details을 참조하십시오.

C++/CLI의 경우이 바로 가기가 있습니다.

void TheMethod(String^ firstArgument, ... array<Object^>^ variableArgs); 

blog post for details를 참조하십시오

는이 같이 않습니다.

+0

에 대해 잘 알고 있습니다 ... C++에는이 확장 기능이 있음을 알지 못했습니다. 관리되는 코드. – LBushkin

+0

@LBushkin : 더 나은 구문으로 업데이트되었습니다. –

0

부스트에는 named parameters 라이브러리가 있습니다 (C#의 params가 무엇인지 정확하게 이해했다면). 다음과 같은 함수를 작성할 수 있습니다.

int y = lib::f(_name = "bob", _index = 2); 

중요한 오버 헤드가 있는지는 알 수 없습니다.

+1

C# params의 이름이 params가 아닙니다. 가변 길이 인수 목록입니다. –

3

현대의 C++에서는 요즘 가변 형식 함수에 대해 최신 유형 안전 사례를 사용할 수 있습니다. 모든 인수가 가변 인자 템플릿으로 동일한 유형

이있는 경우

사용 가변 인자 템플릿 또는 표준 중 하나는 :: initializer_list, 당신은 가변 매개 변수 목록을 통과하기 위해 재귀를 사용합니다. 가변 인자 템플릿 예 :

template<class T> 
void MyFoo(T arg) 
{ 
    DoSomething(arg); 
} 
template<class T, class... R> 
void MyFoo(T arg, R... rest) 
{ 
    DoSomething(arg); 
    // If "rest" only has one argument, it will call the above function 
    // Otherwise, it will call this function again, with the first argument 
    // from "rest" becoming "arg" 
    MyFoo(rest...); 
} 

int main() 
{ 
    MyFoo(2, 5.f, 'a'); 
} 

이 그 정확한 과부하 것, 당신이 MyFoo에 재귀 호출하기 전에 실행 해봐요, 또는 기타 코드, 당신은 함수 MyFoo에 전달할 각 인수의 유형에 대한 과부하를 가지고 있음을 보장합니다 전화 받기. 표준으로

:: initializer_list, 당신은

template<class T> 
void MyFoo(std::initializer_list<T> args) 
{ 
    for(auto&& arg : args) 
    { 
     DoSomething(arg); 
    } 
} 
int main() 
{ 
    MyFoo({2, 4, 5, 8, 1, 0}); // All the arguments have to have the same type 
} 
+0

'static_assert'와 가변 템플릿을 결합하여 유연한 초기화 프로그램 목록을 만들 수 있다는 점은 주목할 만합니다. F.ex. 예제에서'std :: is_base_of'와'T'의 static_assert를 결합하여 모든 타입이 특정 기본 클래스에서 파생되었는지 확인할 수 있습니다. – atlaste

관련 문제