2015년 9월 12일 토요일

[C++11] Variadic arguments

Variadic arguments
: function 에 여러개의 인자를 전달하는 기법



여러개의 인자를 ... 표현으로 class template, function template에 전달할 수 있다.
그리고 template 인자 타입을 표현하는 T 는 가변인자일 경우 Types 로 표현하는 것이 관례이다.

그렇다면 전달된 인자가 몇 개인지 아는 방법은 무엇일까?

'sizeof...' 연산자를 이용해서 가변인자의 개수를 알 수 있다.
'...'이 sizeof 뒤에 붙는 것에 유의하자.

또한 전달받은 인자들을 그대로 다른 function 에 전달할 수도 있다.
'변수이름...' 형태로 전달한다. '...' 이 뒤에 붙는 것에 유의하자.



그렇다면 이제 전달받은 인자를 꺼내서 써봐야 하지 않을까?

가변인자 꺼내기는 방법
1) 첫 번째 인자만큼은 독립된 타입으로 받아야 한다.
2) recursive 를 사용한다.
3) 종료를 위해 인자 없는 함수 제공한다.

Recursive를 사용한다는 의미에 대해서 다시 생각해보자.
위 예제 코드는 실제로 recursive 하게 동작하지는 않는다.

호출되는 foo template 함수는 인자 개숫에 따라 모두 달라지게 된다.
static 으로 선언된 sn 이 호출되는 횟수에 따라서 1, 2, 3 이렇게 증가할 것 같지만
예제를 실행해보면 output 으로 sn 값이 증가하지 않고 항상 1인 것을 볼 수 있다.

매번 같은 foo 함수가 호출되는 것이 아니라는 얘기다.
foo(1, 2.2, 'a'), foo(2.2, 'a'), foo('a'), foo() 가 호출된다.
결국엔 template function 은 컴파일러에 의해 3개의 코드가 생성된다.
매번 새로운 function 이 호출되는 것이다.
결국엔 진짜 recursive 한 logic 은 아니라는 얘기이다.

또한 마지막에 'a' 를 전달할 때는 error가 발생하는데,
args 에 전달할 인자가 없기 때문이다.(T value에 'a'만 전달되고 args에는 아무것도 없다는 얘기)
그래서 인자가 없는 foo() 를 정의한다.








댓글 없음:

댓글 쓰기

[C++] meta programing

재귀 호출에 관해 template meta programming 을 적용한 예제를 살펴보자. #include using namespace std; int fact(int n){ if(n factorial 연산을 하는 일반적인 재귀 호출 함...