템플릿 매개변수의 타입을 정의하는 데 사용되며, 컴파일 타임에 특정 타입에 맞는 함수나 클래스의 인스턴스화가 이루어지도록 돕습니다. 이 말은, typename을 사용하여 컴파일러에게 "이 식별자는 나중에 구체적인 타입으로 치환될 것"이라는 힌트를 제공하는 것입니다.
일반적인 사용 예시
#include <iostream>
using namespace std;
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
int x = 5, y = 10;
cout << "Sum: " << add(x, y) << endl; // Sum: 15
cout << "Sum: " << add<double>(3.14, 2.71) << endl; // Sum: 5.85
return 0;
}
typename과 class는 템플릿 매개변수를 정의할 때 거의 동일하게 동작하지만, typename이 더 일반적인 용어입니다. 원래 class는 클래스 타입을 정의하기 위해 사용되었지만, 템플릿 매개변수에서 타입을 정의하는 데에도 사용할 수 있습니다. 템플릿 매개변수에서 typename을 사용하는 것이 일반적이고 가독성이 좋습니다.
템플릿 매개변수에서 class
template <class T>
void func(T t) {
// 함수 내용
}
템플릿 매개변수에서 typename
template <typename T>
void func(T t) {
// 함수 내용
}
위 두 코드는 같은 기능을 수행합니다.
가벼운 예시
template <typename T>
class MyClass {
public:
int count; // Non-dependency Type
T value; // Dependency Type
vector<int>::iterator vIt; // Non-dependency Nested Type
typename T::iterator TIt; // Nested Dependency Type
// 중첩 의존 타입에서는 type 앞에 class나 typename을 명시해주어야 합니다.
// 생성자 및 메서드는 생략.
}
템플릿 매개변수와 관계없이, 클래스 내에서 단순히 사용되는 일반 타입입니다.
예를 들어, int count와 같이 템플릿 파라미터와 관계없는 멤버 변수는 비의존 타입입니다.
템플릿 매개변수에 의존하는 타입입니다.
예를 들어, T value는 템플릿 파라미터 T에 의존하는 타입이므로 의존 타입입니다.
클래스나 구조체의 정의와 구조에 관련된 개념입니다. 즉, 한 클래스가 다른 클래스를 내부에 포함하거나 정의하는 구조입니다. 이는 두 클래스 간의 내부적 관계로, 한 클래스가 다른 클래스를 사용하거나 그 클래스의 멤버를 포함하는 형태입니다.
ex) iterator는 vector<int>와 같은 클래스 내부에 정의된 타입이므로 중첩 관계입니다.
중첩 타입이면서 의존 타입인 경우로 T::iterator와 같이 클래스 내부에 정의된 타입이지만, 그 타입이 템플릿 매개변수 T에 의존하여 결정되는 경우입니다.
중첩 의존 타입을 사용할 때는 반드시 class나 typename을 해당 타입 앞에 명시하여 'T::iterator'가 타입임을 컴파일러가 알 수 있도록 합니다.