반응형
템플릿 (template)
#include <iostream>
template <typename T>
void print(T arg)
{
std::cout << arg << std::endl;
}
int main()
{
print(1);
print("arg");
}
가변길이 템플릿 (variadic template)
- typename 뒤에 ... 으로 오는 것을 템플릿 파리미터 팩(parameter pack) 이며, 0 개 이상의 템플릿 인자들을 나타냅니다.
- 마찬가지로 함수에 인자로 ... 로 오는 것을 함수 파라미터 팩 이라고 부르며, 0 개 이상의 함수 인자를 나타냅니다.
- 차이점은 템플릿의 경우 타입 앞 에 ... 이 오고, 함수의 경우 타입 뒤 에 ... 가 온다는 점입니다.
#include <iostream>
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);
}
#include <iostream>
#include <string>
template <typename String>
std::string StrCat(const String& s) {
return std::string(s);
}
template <typename String, typename... Strings>
std::string StrCat(const String& s, Strings... strs) {
return std::string(s) + StrCat(strs...);
}
Fold Expression
- C++ 11 에서 도입된 가변 길이 템플릿은 매우 편리하지만, 재귀 함수 형태로 구성해야 하기에 베이스 케이스를 만들어 재귀 호출 종료를 해주어야 합니다.
#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);
}
- 하지만 C++ 17 에 새로 도입된 Fold 형식을 사용한다면 이를 훨씬 간단하게 표현할 수 있습니다.
#include <iostream>
template <typename... Ints>
int sum_all(Ints... nums) {
return (... + nums);
}
template meta-programming:
- 템플릿을 사용하는 프로그래밍 기법으로, 컴파일러에게 프로그램 코드를 생성하도록 하는 방식이다.
- 이러한 기법은 컴파일 시점에 많은 것을 결정하도록 하여, 실행 시점의 계산을 줄여준다.
- 이 기법은 C++ 프로그래밍 언어에서 주로 사용한다.
template meta-programming에 대한 상세 내용은 다음 내용을 참고하시기 바랍니다.
참고
- [씹어먹는 C++] 템플릿 (template): https://modoocode.com/219
- [씹어먹는 C++] 가변 길이 템플릿 (template): https://modoocode.com/290
- 위키피디아: 템플릿 메타프로그래밍:
https://ko.wikipedia.org/wiki/%ED%85%9C%ED%94%8C%EB%A6%BF_%EB%A9%94%ED%83%80%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
반응형
'Study: Software(SW) > SW: Language' 카테고리의 다른 글
[C++] 알고리즘 (#include <algorithm>): 있는 거 가져다 쓰자. (0) | 2022.06.15 |
---|---|
[C++] 템플릿 메타 프로그래밍 (Template Meta-programming) (0) | 2022.06.14 |
[C++] 객체지향 프로그래밍: 추상화, 캡슐화, 상속성, 다형성, 동적바인딩... (0) | 2022.06.13 |
[C++] STL 컨테이너: 자료구조를 이해하고 사용하자! (C++ 표준 라이브러리) (0) | 2022.06.13 |
[C++] 포인터(*), 레퍼런스(&)와 상수(Const) + Smart Pointer, Constexpr (0) | 2022.06.13 |