치춘짱베리굿나이스

[Rank 4] CPP 07 본문

42/42s Cursus

[Rank 4] CPP 07

치춘 2022. 9. 17. 15:18

CPP 07

C++ templates

C++ 템플릿

템플릿

template <typename T>
T add(T x, T y) { return x + y; }

같은 이름의 함수를 인자 자료형이나 반환값만 다르게 하여 새로 생성하는 것을 오버로딩이라고 했었다

다만 오버로딩은 int, float, double, … 등 모든 자료형에 대해 함수를 따로따로 생성해주어야 한다는 단점이 있다 (귀찮다)

템플릿을 이용하면 자료형에 구애받지 않고 함수를 작성할 수 있으며, 어떤 자료형이든 내부에서 사용하는 연산자나 함수에 대한 오버로딩이 존재한다면 결과값을 얻어낼 수 있다

템플릿은 template라는 키워드 (예약어) 로 정의하고, typename T에서 T는 아무 단어나 넣어도 되지만 보편적으로 T가 많이 사용된다

 

template <typename T, typename U, typename V>
template <typename ... args>

typename은 여러 개 지정할 수도 있고, 가변 길이로 지정할 수도 있다

보통 클래스 템플릿에서 사용하며 여러 개의 타입을 내부에서 사용하고 싶을 때 쓴다

 

https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl

C++11에서 추가되는 extern template 기능을 사용하지 않으면 템플릿 함수의 정의를 별개의 .cpp 파일에 분리하는 것은 불가능하다

템플릿은 말 그대로 (컴파일러가 클래스나 함수를 생성하기 위한) ‘템플릿' 이지 함수나 클래스가 아니다

컴파일러는 템플릿을 사용한 함수를 찾으면 그에 해당하는 코드를 생성하기 위해 템플릿 정의 부분을 헤더에서 찾으므로 .cpp 파일에 정의를 분리할 수는 없다

범위 지정 연산자

::foo();
std::cout << "hi\n";
SomeClass::SomeInternalClass::SomeFunc();

url로 치면 /와 비슷한 의미를 가지며, 폴더나 경로에서 파일을 찾듯이 함수를 namespace 내에서 찾는다는 의미이다

namespacestd와 같이 함수나 변수들이 선언된 범위의 이름이며, 파일경로처럼 여러 개를 같이 사용하는 것도 가능하다

위의 예시에서

  • ::foo() 는 전역에 선언된 foo를 사용하겠다는 의미 (지역에 존재하는 함수 및 변수를 무시)
  • std::coutstd namespace 안의 cout을 사용하겠다는 의미
  • SomeClass::SomeInternalClass::SomeFunc()SomeClass 안의 SomeInternalClass 안의 SomeFunc()를 사용하겠다는 의미

만약 이름은 같은데 서로 다른 namespace에 위치한 함수들이 있다면 범위 지정 연산자를 통해 서로 다른 함수를 충돌 없이 호출할 수 있는 것이다

'42 > 42s Cursus' 카테고리의 다른 글

[Rank 5] inception - Dockerfile  (3) 2022.10.14
[Rank 4] CPP 08  (0) 2022.09.18
[Rank 4] CPP 06  (0) 2022.09.17
[Rank 4] CPP 05  (0) 2022.09.11
[Rank 4] CPP 04  (0) 2022.09.11
Comments