템플릿 -2. 가변 길이 템플릿

·2022년 6월 6일
0

cpp_study

목록 보기
13/25

가변 길이 템플릿

템플릿을 사용해서 임의의 개수의 인자를 받아 보자.

#include <iostream>
template <typename T> void print(T arg) {
   std::cout << arg << std::endl;
 }
// 🥰 아래 집중!
template <typename T, typename... Types> void print(T arg, Types... args) {
   std::cout << arg << ", ";
   print(args...);
 }
int main() {
   print(1, 3.1, "abc"); print(1, 2, 3, 4, 5, 6, 7);
}

/*
  1, 3.1, abc
  1, 2, 3, 4, 5, 6, 7
*/

파라미터 팩

템플릿 파라미터 팩(parameter pack): typename 뒤에 ... 으로 오는 것
함수 파라미터 팩: 함수에 인자로 ...으로 오는 것

둘의 차이

  • 템플릿: 타입 ...이 옴
  • 함수: 타입 ...이 옴

오버로딩 유의하기

위 코드에서 print 함수의 각 순서를 바꾸면 컴파일 오류가 발생함.
C++ 컴파일러는 함수를 컴파일할 때, 자신의 앞에 정의되어 있는 함수들 밖에 못 보기 때문.
그래서 마지막에 print()가 호출되고 해당하는 함수가 존재하지 않기 때문에 오류 발생.

임의의 개수의 문자열을 합치는 함수

#include <iostream>

int sum_all() { return 0; }

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

template <typename... Ints> 
double average(Ints... nums) {
  return static_cast<double>(sum_all(nums...)) / sizeof...(nums); 
}
     
int main() {
// (1 + 4 + 2 + 3 + 10) / 5
std::cout << average(1, 4, 2, 3, 10) << std::endl;
}

sizeof... 연산자

template <typename... Ints> 
double average(Ints... nums) {
  return static_cast<double>(sum_all(nums...)) / sizeof...(nums); 
}

fold expression

재귀 함수 호출을 종료하기 위해 만드는 베이스 케이스를 없애기 위해 만든 C++17의 Fold 형식

#include <iostream>

template <typename... Ints> 
int sum_all(Ints... nums) {
  return (... + nums); 
}
int main() {
  // 1 + 4 + 2 + 3 + 10
  std::cout << sum_all(1, 4, 2, 3, 10) << std::endl;
}

위와 같은 형식을 단항 좌측 Fold(Unary left fold)라고 부름.
그 외는 c++ reference 참고

profile
이것저것 개발하는 것 좋아하지만 서버 개발이 제일 좋더라구요..

0개의 댓글