Alias declaration
Modern C++에 적응하기
Effective Modern C++ Chapter 3. Alias declaration
alias declaration
C++98의 typedef
보다 더욱 직관적이고 효과적인 type declaration 이 C++11에 도입되었다.
1 | using UptrMapSS = std::unique_ptr<std::unordered_map<std::string, std::string>>; |
type declaration 은 템플릿화 할 수 있다.
1 | template <typename T> |
기존의 typedef
를 사용하려면 조금 더 복잡하다.
1 | template <typename T> |
템플릿 매개변수에 의존적인 타입을 사용하려면 typedef
의 경우 typename
키워드를 사용해야 한다.
1 | template <typename T> |
반면 type declaration 의 템플릿화를 사용하면 typename
키워드를 앞에 붙일 필요가 없다.
1 | template <typename T> |
또한 번거롭게 ::type
(내부에 선언된 typedef
의 관례)역시 붙일 필요가 없다.
MyAllocList
가 type declaration 의 템플릿화이므로 MyAllocList<T>
는 반드시 타입이어야 하고, 컴파일러도 이를 알고있다. 따라서 MyAllocList<T>
는 비의존적 타입 이며, typename
키워드를 붙일 필요가 없다.
반면, MyAllocList<T>::type
이 타입이라고 컴파일러는 보장할 수 없다. MyAllocList
의 특수화에서 내부에 MyAllocList<T>::type
이라는 변수가 선언 되었을 수도 있기 때문이다.
따라서 MyAllocList<T>::type
이 타입이라는 것은 전적으로 T
에 의존한다. 그렇기 때문에 typename
을 앞에 붙여야한다.
C++11 에서는 <type_traits>
헤더에 타입 변환 도구가 Template meta programming 형태로 선언되어 있다.
1 | std::remove_const<T>::type |
C++14 에서 이러한 도구들에 대한 type declaration 이 추가되었다.
1 | template <typename T> |
References
Alias declaration