상세 컨텐츠

본문 제목

template method 기본 인자에 대한 형식 연역

컴퓨터 언어/C++

by cepiloth 2021. 4. 29. 16:26

본문

728x90
반응형

기본 호출 인자에 대해서는 형식 연역을 하지 않는다.

template<typename T>
void f(T = "") {

}

int main() {

	f(1);	// T 를 int로 연역한다. 따라서 f<int>(1)을 호출한다.
	f();	// 오류: T를 연혁할 수 없다.
}

 

위 코드를 쓰고 싶다면 템플릿 파라미터에 대한 기본 인자를 선언해야 한다.

template<typename T = std::string>
void f(T = "") {

}


Inline을 쓰지 않는 이유

 일반적으로 함수 템플릿을 inline으로 선언할 필요는 없다. 평범한 인라인이 아닌 함수와 달리 인라인이 함수 템플릿도 헤더 파일에 정의할 수 있고, 이 헤더 파일을 여러 번역단위translation unit에 포함시킬 수 있다.

특정 형식에 대해 템플릿 전체를 특수화하는 경우는 예외다. 이때는 그 결과로 나온 코드가 더 이상 일반적이지 않기 때문이다.(모든 템플릿 파라미터가 정의됨).

언어의 정의를 엄격히 따져보자면 inline은 함수의 저의가 프로그램 내에 여러 번 나타날 수 있다는 뜻이다. 그리고 그 함수에 대한 호출은 "인라인화 되길 기대한다"라고 컴파일러에게 알리는 힌트이기도 하다. 그렇게 하면 더 효율적인 코드를 만들 수 하지만 대부분은 효율이 더 떨어진다. 요즘에는 inline키워드가 없더라도 컴파일러가 언제 함수를 인라인화해야 하는지 더 잘판한다. 그렇더라도 인라인화를 할지 판단할 때 inline키워드가 있는지를 고려한다.

Template Method 요약

 · 함수 템프릿은 다양한 템플릿 인자에 대한 함수군을 정의한다.
 · 템플릿 파라미터에 종속된 함수 파라미터에 인자를 전달하면 함수 템플릿은 템플릿 파라미터 형식을 연역한 후 해당 형식으로 인스턴스화된다.
 · 템플릿 파라미터를 명시적으로 한정지을 수 있다.
 · 템플릿 파라미터에 대해 기본 인자를 정의할 수 있다. 이전 템플릿 파라미터를 사용할 수도 있고 그 뒤에 기본 인자를 가지 않는 파라미터가 나올 수도 있다.
 · 함수 템플릿을 오버로딩할 수 있다.


다른 함수 템플릿으로 함수 템플릿을 오버로딩한다면 각 호출에 일치하는 함수 템플릿은 꼭 하나가 되도록 주의해야 한다.
 · 함수 템플릿을 오버로딩한다면 수정 사항은 템플릿 파라미터를 명시하는 것 정도에 그쳐야 한다.
 · 오버로딩한 함수 템플릿을 호출하기 전에 모든 오버로딩 버전을 볼 수 있어야 한다.

728x90
반응형

'컴퓨터 언어 > C++' 카테고리의 다른 글

std::string 으로 format 구현  (0) 2021.04.29
C++ 메모리 관리  (0) 2021.04.29
template method  (0) 2021.04.29
전방 선언 Forward Declaration  (0) 2020.09.25
타입추론  (0) 2020.06.22

관련글 더보기

댓글 영역