'C++' typename

토스트·2025년 1월 4일

'C++' basic

목록 보기
10/35

typename

템플릿 매개변수의 타입을 정의하는 데 사용되며, 컴파일 타임에 특정 타입에 맞는 함수나 클래스의 인스턴스화가 이루어지도록 돕습니다. 이 말은, 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;
}

템플릿 매개변수에서 class VS typename

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을 명시해주어야 합니다.
    
    // 생성자 및 메서드는 생략.
}

비의존 타입(Non-dependency Type)

템플릿 매개변수와 관계없이, 클래스 내에서 단순히 사용되는 일반 타입입니다.
예를 들어, int count와 같이 템플릿 파라미터와 관계없는 멤버 변수는 비의존 타입입니다.

의존 타입(Dependency Type)

템플릿 매개변수에 의존하는 타입입니다.
예를 들어, T value는 템플릿 파라미터 T에 의존하는 타입이므로 의존 타입입니다.

비의존 중첩 타입(Non-dependency Nested Type)

클래스나 구조체의 정의와 구조에 관련된 개념입니다. 즉, 한 클래스가 다른 클래스를 내부에 포함하거나 정의하는 구조입니다. 이는 두 클래스 간의 내부적 관계로, 한 클래스가 다른 클래스를 사용하거나 그 클래스의 멤버를 포함하는 형태입니다.

ex) iterator는 vector<int>와 같은 클래스 내부에 정의된 타입이므로 중첩 관계입니다.

중첩 의존 타입(Nested Dependency Type)

중첩 타입이면서 의존 타입인 경우로 T::iterator와 같이 클래스 내부에 정의된 타입이지만, 그 타입이 템플릿 매개변수 T에 의존하여 결정되는 경우입니다.

중첩 의존 타입을 사용할 때는 반드시 class나 typename을 해당 타입 앞에 명시하여 'T::iterator'가 타입임을 컴파일러가 알 수 있도록 합니다.

0개의 댓글