기본 매개변수를 가진 템플릿은 C++의 일반 프로그래밍을 위한 강력한 메커니즘입니다.
문제의 역사:
템플릿은 STL 라이브러리의 시작점이었습니다. 나중에 템플릿 함수와 클래스에 대해 기본 매개변수 값을 지정할 수 있는 기능이 추가되어 템플릿을 더 보편적으로 만들고 코드 확장성을 지원하게 되었습니다.
문제:
일반 함수와 템플릿이 중복되고 전문화할 때 모호성이 발생할 수 있습니다. 템플릿의 기본 매개변수는 유연성을 높일 수 있지만, 종종 복잡한 컴파일 오류를 일으킬 수 있습니다.
해결:
특히 비템플릿 버전과의 중복이 있을 경우 템플릿의 기본 매개변수 값을 최소화하는 것이 좋습니다. 함수 호출 시 우선 순위는 일반 함수와의 정확한 일치를 선호하며, 템플릿보다 우선합니다.
코드 예:
template<typename T = int> T multiply(T a, T b = T(2)) { return a * b; } int multiply(int a, int b) { return a + b; }
multiply(5, 4) 호출은 int multiply(int, int) 함수를 선택하고, multiply<>(5) 호출은 템플릿을 호출하며 b는 2로 설정됩니다.
주요 특징:
템플릿 함수의 다음 정의에서 기본 매개변수를 선언할 수 있나요?
아니요, 기본 매개변수는 하나의 장소(일반적으로 선언)에서만 지정할 수 있으며, 그렇지 않으면 컴파일 오류가 발생합니다.
템플릿과 비템플릿 함수 간의 모호성이 발생하면 어떻게 되나요? 컴파일러는 어떤 것을 호출할지 어떻게 선택하나요?
컴파일러는 인수가 정확히 맞는 경우 비템플릿 함수에 우선 순위를 두고 항상 호출합니다. 템플릿은 정확한 일치가 없을 때만 호출됩니다.
템플릿 매개변수의 비유형 값 (예: 숫자)에 대해 기본 매개변수를 지정할 수 있나요?
네, 예를 들어:
template<typename T, int N = 8> class Array { T data[N]; };
부정적인 케이스
일치하는 매개변수와 기본 매개변수를 가진 템플릿 함수와 비템플릿 함수가 모두 선언되었습니다. 하나의 모듈에서 호출이 예상대로 작동하지만, 다른 모듈에서는 의외로 잘못된 함수 버전이 선택됩니다.
장점:
단점:
긍정적인 케이스
충돌하는 구성에 대해 템플릿 및 비템플릿 함수에 대해 명시적으로 서로 다른 이름을 선언하였고, 기본 매개변수는 오직 한 버전만 가집니다.
장점:
단점: