이 영역을 누르면 첫 페이지로 이동
천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

페이지 맨 위로 올라가기

천천히 꾸준히 조용히

천천히 꾸준히 조용히.. i3months 블로그

[C++] Template

  • 2022.12.17 15:59
  • Programming Language/C++
반응형

 

 

 

C++은 Template을 통해 Generic Programming을 지원한다. (Compile time Polymorphism)

 

(제네릭 프로그래밍은 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있는 기술에 중점을 두어 재사용성을 높일 수 있는 프로그래밍 방식 - 위키백과)

 

 

 

 

 

C++에서 Template은 class 와 function으로 나뉜다. 

 

 

 

1. Class Template

 

 

클래스들이 여러 개 있는데 자료형만 다른 경우 template을 적용해 간단하게 표현할 수 있다.

 

 

 

 

(template 선언 시 넘겨주는 type-parameter-key 값인 typename과 class는 같은 역할을 한다)

 

 

 

 

컴파일러는 Pair<int> 와 Pair<double>을 보고 template을 참고해 해당하는 class 를 만들어준다.

(template에서 T를 해당하는 타입으로 교체한다.)

 

template에 parameter는 여러 개 존재할 수 있고, primitive 타입도 parameter가 될 수 있다.

 

 

C++17 버전부터는 deduction을 제공해 타입을 기입하지 않아도 타입을 알아서 추론해주는 기능을 제공한다. (<>를 사용하지 않아도 된다)

항상 추론에 성공하지는 않고, 생성자 호출에서 모든 parameter를 유추 할 수 있는 경우 성공한다.

 

추론이 불가능한 경우 컴파일 에러가 발생한다.

 

 

 

template을 작성할 때 항상 하던 것 처럼 헤더 파일과 cc 파일을 따로 작성하게 되면 undefined reference to : 에러가 발생할 수 있다. (Linking 에러)

 

cc 파일을 바이너리 코드로 변환한 후 변환한 파일들을 Linking 까지 마쳐야 실행 가능한 파일이 되는데, template 작성 시 헤더와 cc를 분리하면 헤더 파일에는 선언만 되어 있어 main.cc 파일을 컴파일 할 때 클래스를 만들 수 없다.

 

따라서 헤더에 정의까지 함께 해 주는 방식을 사용해서 문제를 해결한다.

 

 

 

2. Function Template

 

 

Class Template과 크게 다른 점은 없다.

 

 

 

 

그런데, function template을 사용하는 도중 함수 오버로딩과 deduction이 겹치는 경우는 어떻게 처리될까?

 

1. 일단은 있으면 그대로 쓴다.

2. 없으면 템플릿으로 해당 함수를 만들 수 있는지 확인한다.

3. 오버로딩 규칙을 따른다. (프로모션, 컨버전...)

 

각 단계에서 여러 개의 함수가 가능하다면 오류를 뱉는다.

 

 

템플릿으로 생성된 함수는 <> 가 붙어있기에 재활용은 불가능하다.

 

 

 

 

 

반응형
저작자표시 (새창열림)

'Programming Language > C++' 카테고리의 다른 글

[C++] 예외처리  (0) 2022.12.18
[C++] STL  (0) 2022.12.15
[C++] Design Pattern  (0) 2022.11.24
[C++] 정리 (1)  (0) 2022.11.23
[C++] OOP (5) Dynamic dispatch / Multiple Inheritance  (0) 2022.11.22

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [C++] 예외처리

    [C++] 예외처리

    2022.12.18
  • [C++] STL

    [C++] STL

    2022.12.15
  • [C++] Design Pattern

    [C++] Design Pattern

    2022.11.24
  • [C++] 정리 (1)

    [C++] 정리 (1)

    2022.11.23
다른 글 더 둘러보기

정보

천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

  • 천천히 꾸준히 조용히의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (677) N
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • C (25)
      • C++ (12)
      • Java (19)
      • JavaScript (15)
      • Python (1)
      • PHP (2)
    • Computer Science (142)
      • Machine Learning (38)
      • Operating System (18)
      • Computer Network (28)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
      • Compiler Design (11)
      • Computer Security (13)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Amazon Web Service (8)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • 💡 솔루션 (17)
    • 👥 모각코 (9)
    • 💬 기록 (7)
    • 📚 공부 (6) N
    • -------------- (25)

최근 글

나의 외부 링크

메뉴

  • 홈
반응형

정보

i3months의 천천히 꾸준히 조용히

천천히 꾸준히 조용히

i3months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © i3months.

티스토리툴바