Study: Software(SW)/SW: Language

[C++] 템플릿 (Template) (feat. Template Meta-programming)

DrawingProcess 2022. 6. 14. 09:38
반응형

템플릿 (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 Meta-programming)

template meta-programming: 템플릿을 사용하는 프로그래밍 기법으로, 컴파일러에게 프로그램 코드를 생성하도록 하는 방식이다. 이러한 기법은 컴파일 시점에 많은 것을 결정하도록 하여, 실행 시점

csj000714.tistory.com

참고

반응형