-
[template] 왜 typename parameter에 0을 주나요?개발/C·C++ 2021. 4. 30. 16:38
※ 번역글입니다
※ 의역이 있고 오역이 있을 수 있습니다
template<typename T, typename lfEnableIf<lfIsArithmetic<T>::Value>::Type = 0>
이 코드는 이름 있는 템플릿 타입 매개변수로 T를 선언하고, 이름 없는 템플릿 값 매개변수를 선언한 것입니다.
lfEnableIf<lfIsArithmetic<T>::Value>::Type
타입은 가능한 조건을 만나면lfInt
로 바뀝니다.template<typename T, lfInt = 0>
그러나 두 번째 템플릿 매개변수는
lfEnablelf
템플릿의nested type
이기 때문에,typename
키워드를 이용해 컴파일러에게Type
이 실제로 타입이라는 것을 명시해줘야 합니다. 템플릿의 두 번째 파라티머는 이름이 없지만, 원한다면 이름을 부여할 수 있습니다.template<typename T, typename lfEnableIf<lfIsArithmetic<T>::Value>::Type V = 0>
V
라고 하겠습니다. 이 매개변수의 이름은 템플릿 어디에서도 사용되지 않아 명시적으로 구체화할 이유가 없습니다. 더미 디폴트 값을 가지는 더미 매개변수일 뿐입니다. 디폴트 값으로 0 대신에 어느 숫자든 가능합니다. 이 예제에서typename
은 오해할 만한 소지가 많습니다. 사용된 목적이 두 가지로, 연관성도 없습니다.첫 번째 템플릿 매개변수 선언인
template T
의 의미는 타입 매개변수로 T를 선언한 것입니다. 여기에서는typename
을class
로 바꿔도 됩니다. 두 번째 선언인typename lfEnableIf<lfIsArithmetic<T>::Value>::Type = 0
은 컴파일러에게typename lfEnableIf<lfIsArithmetic<T>::Value>::Type = 0
가 타입이니까 값 매개변수(value parameter) 선언으로 전환하라는 걸 알려주는 역할을 합니다. 때문에typename
을class
로 대체할 수 없습니다.'개발 > C·C++' 카테고리의 다른 글
[template] 템플릿 특수화 (0) 2021.05.01 [template] 함수 템플릿(function template) (0) 2021.04.30 [예외 처리] 너라고 예외는 아니야 (0) 2021.04.28 [volatile] 컴파일러! 나대지 마라 (0) 2021.04.27 [const_cast] 제한적으로 활용하자 (0) 2021.04.27