치춘짱베리굿나이스
[Rank 4] CPP 07 본문
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
내에서 찾는다는 의미이다
namespace
는 std
와 같이 함수나 변수들이 선언된 범위의 이름이며, 파일경로처럼 여러 개를 같이 사용하는 것도 가능하다
위의 예시에서
::foo()
는 전역에 선언된foo
를 사용하겠다는 의미 (지역에 존재하는 함수 및 변수를 무시)std::cout
은std
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 |