템플릿을 사용해서 임의의 개수의 인자를 받아 보자.
#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;
}
template <typename... Ints>
double average(Ints... nums) {
return static_cast<double>(sum_all(nums...)) / sizeof...(nums);
}
재귀 함수 호출을 종료하기 위해 만드는 베이스 케이스를 없애기 위해 만든 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 참고