DrawingProcess
드프 DrawingProcess
DrawingProcess
전체 방문자
오늘
어제
«   2025/06   »
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
  • 분류 전체보기 (967) N
    • Profile & Branding (25) N
      • Career (18) N
    • IT Trends (254)
      • Conference, Faire (Experien.. (31)
      • News (187)
      • Youtube (19)
      • TED (8)
      • Web Page (2)
      • IT: Etc... (6)
    • Contents (97)
      • Book (66)
      • Lecture (31)
    • Project Process (94)
      • Ideation (0)
      • Study Report (34)
      • Challenge & Award (22)
      • 1Day1Process (5)
      • Making (5)
      • KRC-FTC (Team TC(5031, 5048.. (10)
      • GCP (GlobalCitizenProject) (15)
    • Study: ComputerScience(CS) (72)
      • CS: Basic (9)
      • CS: Database(SQL) (5)
      • CS: Network (14)
      • CS: OperatingSystem (3)
      • CS: Linux (39)
      • CS: Etc... (2)
    • Study: Software(SW) (95)
      • SW: Language (29)
      • SW: Algorithms (1)
      • SW: DataStructure & DesignP.. (1)
      • SW: Opensource (15)
      • SW: Error Bug Fix (43)
      • SW: Etc... (6)
    • Study: Artificial Intellige.. (149)
      • AI: Research (1)
      • AI: 2D Vision(Det, Seg, Tra.. (35)
      • AI: 3D Vision (70)
      • AI: MultiModal (3)
      • AI: SLAM (0)
      • AI: Light Weight(LW) (3)
      • AI: Data Pipeline (7)
      • AI: Machine Learning(ML) (1)
    • Study: Robotics(Robot) (33)
      • Robot: ROS(Robot Operating .. (9)
      • Robot: Positioning (8)
      • Robot: Planning & Control (7)
    • Study: DeveloperTools(DevTo.. (83)
      • DevTool: Git (12)
      • DevTool: CMake (13)
      • DevTool: NoSQL(Elastic, Mon.. (25)
      • DevTool: Container (17)
      • DevTool: IDE (11)
      • DevTool: CloudComputing (4)
    • 인생을 살면서 (64)
      • 나의 취미들 (7)
      • 나의 생각들 (42)
      • 여행을 떠나자~ (10)
      • 분기별 회고 (5)

개발자 명언

“ 매주 목요일마다 당신이 항상 하던대로 신발끈을 묶으면 신발이 폭발한다고 생각해보라.
컴퓨터를 사용할 때는 이런 일이 항상 일어나는데도 아무도 불평할 생각을 안 한다. ”

- Jef Raskin

맥의 아버지 - 애플컴퓨터의 매킨토시 프로젝트를 주도

인기 글

최근 글

최근 댓글

티스토리

hELLO · Designed By 정상우.
DrawingProcess

드프 DrawingProcess

Study: Software(SW)/SW: Language

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

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

참고

  • [씹어먹는 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
    'Study: Software(SW)/SW: Language' 카테고리의 다른 글
    • [C++] 알고리즘 (#include <algorithm>): 있는 거 가져다 쓰자.
    • [C++] 템플릿 메타 프로그래밍 (Template Meta-programming)
    • [C++] 객체지향 프로그래밍: 추상화, 캡슐화, 상속성, 다형성, 동적바인딩...
    • [C++] STL 컨테이너: 자료구조를 이해하고 사용하자! (C++ 표준 라이브러리)
    DrawingProcess
    DrawingProcess
    과정을 그리자!

    티스토리툴바