개발자 면접 공부/C-C++

가변길이 템플릿

chogyujin 2023. 9. 4. 19:24
728x90

1. 개요

오늘은 C++의 가변길이 템플릿 (매개변수 팩) 에 대해서 공부하도록 하겠습니다.


2. 가변길이 템플릿(매개변수 팩)?

가변길이 템플릿(Variabic template)은 여러개의 인자를 가질 수 있습니다.

예를 들어 가변 길이 템플릿을 이용하여 정의한 함수 템플릿은 정해준 숫자가 아닌 가변 길이 인자를 받을 수 있습니다.

 

아래 코드에서 typename 뒤에 선언된 "..."이 템플릿 파라미터 팩(parameter pack)이라고 불립니다.

이 템플릿 파라미터 팩을 선언하면 이 템플릿은 0개 이상의 (가변된 길이의) 인자를 받을 수 있다는 뜻 입니다.


2. Sample Code

아래 소스 코드는 가변 길이 템플릿을 이용하여 여러 개의 인자를 전달받아 화면에 출력하는 예시입니다.

 

화면에 출력하기 위해 void print() 함수를 정의하였는데, 가변 길이 템플릿에서 print() 함수를 호출하기 때문에 void print()함수를 가변길이 템플릿 아래에 구현하면 컴파일 에러가 발생합니다.

컴파일러는 해당 소스 코드의 앞에 정의 되어 있는 함수밖에 읽지 못하기 때문입니다.

 

또, C++11에 도입된 가변 길이 템플릿은 한 가지 단점이 있습니다.

재귀 함수 형태로 구성해야 하기 때문에 반드시 재귀 종료 함수 (base case)를 따로 만들어야 합니다.

 

하지만 C++17에 도입된 fold 형식을 사용한다면 훨씬 간단하게 표현할 수 있습니다.

#include<iostream>

using namespace std;

void print()
{
	cout << "Last Call Function" << '\n';
}

template <typename T, typename... types>
void print(T var1, types... var2)
{
	cout << var1 << '\n';
	print(var2...);
}

int main()
{
	print(1, 2, 3.14, "나는 지금 출력중","이제 끝내야 겠지?");

	return 0;
}

fold 방식

#include<iostream>

using namespace std;



template <typename... types>
void print(types... var2)
{
	(cout << ... << var2);
}

int main()
{
	print(1, 2, 3.14, "나는 지금 출력중","이제 끝내야 겠지?");
	
	return 0;
}

3. sizeof...

sizeof 연산자는 인자의 크기를 반환하지만, 파라미터 팩으로 전달받은 인자에 sizeof... 연산자를 사용하면 전체 인자의 개수를 반환합니다.

#include<iostream>

using namespace std;

int SumAll() { return 0; }

template <typename... types>
int SumAll(int num, types... nums)
{
	return num + SumAll(nums...);
}

template <typename... types>
double avarage(types... nums)
{
	return static_cast<double>(SumAll(nums...)) / sizeof...(nums);
}

int main()
{
	cout << avarage(5, 5, 5, 5, 5);
	
	return 0;
}

sizeof... 은 5이며 현재 파라미터 팩으로 인해 전부 더한값은 25이므로 25/5는 5가 출력됩니다.

#include<iostream>

using namespace std;

template <typename... types>
int SumAll( types... nums)
{
	return (nums+...);
}

template <typename... types>
double avarage(types... nums)
{
	return (double)(SumAll(nums...)) / sizeof...(nums);
}

int main()
{
	cout << fixed;
	cout.precision(6);
	cout << avarage(4, 5, 3, 2, 5);
	
	return 0;
}

fold 방식도 사용해보았습니다.


4. Ref

https://a-researcher.tistory.com/18

 

[c++] variadic template (가변 길이 템플릿)

Variadic Template Variadic function templates in C++ - GeeksforGeeks 가변 길이 템플릿 (Variadic template)은 여러개의 인자를 가질 수 있습니다. 예를 들어 가변 길이 템플릿을 이용하여 정의한 함수 템플릿은 정해

a-researcher.tistory.com

https://www.devoops.kr/144

 

C++ 가변인자 템플릿(Variadic template), fold expression(C++17)

Parameter Pack 각 요소 꺼내기 Pack Expansion -> array or tuple에 담기 #include #include using namespace std; template void foo(Types ... args) { // 각각의 타입별 값을 tuple 개별 요소로 추가 tuple tp(args...); cout

www.devoops.kr

 

'개발자 면접 공부 > C-C++' 카테고리의 다른 글

C++ 11 tuple  (0) 2023.09.13
함수에 const 위치에 따른 결과  (0) 2023.09.09
구조체, 클래스 패딩 바이트  (2) 2023.08.28
C++11,14 람다식  (2) 2023.06.14
상수와 리터럴 (Constant & Literal)  (0) 2023.05.20