기본 호출 인자에 대해서는 형식 연역을 하지 않는다.
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으로 선언할 필요는 없다. 평범한 인라인이 아닌 함수와 달리 인라인이 함수 템플릿도 헤더 파일에 정의할 수 있고, 이 헤더 파일을 여러 번역단위translation unit에 포함시킬 수 있다.
특정 형식에 대해 템플릿 전체를 특수화하는 경우는 예외다. 이때는 그 결과로 나온 코드가 더 이상 일반적이지 않기 때문이다.(모든 템플릿 파라미터가 정의됨).
언어의 정의를 엄격히 따져보자면 inline은 함수의 저의가 프로그램 내에 여러 번 나타날 수 있다는 뜻이다. 그리고 그 함수에 대한 호출은 "인라인화 되길 기대한다"라고 컴파일러에게 알리는 힌트이기도 하다. 그렇게 하면 더 효율적인 코드를 만들 수 하지만 대부분은 효율이 더 떨어진다. 요즘에는 inline키워드가 없더라도 컴파일러가 언제 함수를 인라인화해야 하는지 더 잘판한다. 그렇더라도 인라인화를 할지 판단할 때 inline키워드가 있는지를 고려한다.
· 함수 템프릿은 다양한 템플릿 인자에 대한 함수군을 정의한다.
· 템플릿 파라미터에 종속된 함수 파라미터에 인자를 전달하면 함수 템플릿은 템플릿 파라미터 형식을 연역한 후 해당 형식으로 인스턴스화된다.
· 템플릿 파라미터를 명시적으로 한정지을 수 있다.
· 템플릿 파라미터에 대해 기본 인자를 정의할 수 있다. 이전 템플릿 파라미터를 사용할 수도 있고 그 뒤에 기본 인자를 가지 않는 파라미터가 나올 수도 있다.
· 함수 템플릿을 오버로딩할 수 있다.
다른 함수 템플릿으로 함수 템플릿을 오버로딩한다면 각 호출에 일치하는 함수 템플릿은 꼭 하나가 되도록 주의해야 한다.
· 함수 템플릿을 오버로딩한다면 수정 사항은 템플릿 파라미터를 명시하는 것 정도에 그쳐야 한다.
· 오버로딩한 함수 템플릿을 호출하기 전에 모든 오버로딩 버전을 볼 수 있어야 한다.
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 |
댓글 영역