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() 를 정의한다.
피드 구독하기:
댓글 (Atom)
[C++] meta programing
재귀 호출에 관해 template meta programming 을 적용한 예제를 살펴보자. #include using namespace std; int fact(int n){ if(n factorial 연산을 하는 일반적인 재귀 호출 함...
-
Smart Pointer : 포인터처럼 동작하며 자동으로 메모리를 해제하고 안전하게 resource를 관리하도록 돕는 객체 포인터는 소멸자가 호출되지 않아 memory leak이 발생한다. Java, C#같은 VM이 있는 언어는 VM에서 G...
-
nullptr 란? C++11 에서 지원하는 null pointer 상수 먼저 pointer 가 초기화될 수 있는 정수 값을 살펴보자. 정수 0은 모든 타입의 포인터에 암시적 형변환을 통해서 초기화 값으로 사용될 수 있다. 하지만 그 이...
-
자료 구조를 순회하여 데이터에 접근하는 방법을 살펴보자. Container 에 저장된 데이터에 접근하기 위해 대표적으로 Iterator의 begin(), end() function 을 사용한다. 하지만 위 예제에서 show() 함수에 배열이...
댓글 없음:
댓글 쓰기