[Modern C++] 항목 9: typedef보다 별칭 선언을 선호하라
카테고리: Cpp
이 글은 아래의 책을 정리하였습니다. 이펙티브 모던 C++, 스콧 마이어스 저자, 류광 번역
가독성이 떨어지는 직역들을 수정하며 정리하였습니다. e.g. 연역 → 추론, 중복적재 → 오버로딩
📦 3. 현대적 C++에 적응하기
👉🏻 항목 9: typedef보다 별칭 선언을 선호하라
// typedef 사용
typedef unique_ptr<unordered_map<string,string>> UPtrMapSS;
// 별칭 선언
using UPtrMapSS = unique_ptr<unordered_map<string,string>>;
// typedef 사용
typedef void (*FP)(int, const string&);
// 별칭 선언
using FP = void (*)(int, const string&);
typedef보다 별칭 선언을 하는 쪽이 비교적 쉽다.
🔧 별칭 템플릿
// 별칭 템플릿
template<typename T>
using MyAllocList = std::list<T, MyAlloc<T>>;
MyAllocList<Widget> lw;
// 별칭 템플릿 + 클래스 템플릿
template<typename T>
class Widget {
private:
MyAllocList<T> list;
...
};
// typedef 사용
template<typename T>
struct MyAllocList {
typedef std::list<T, MyAlloc<T>> type;
};
MyAllocList<Widget>::type lw;
// typedef 템플릿화 편법 + 클래스 템플릿
template<typename T>
class Widget {
private:
typename MyAllocList<T>::type list;
...
};
typedef는 편법을 쓰지 않으면, 기본적으로 템플릿화할 수 없다.- 편법을 쓰면, 클래스 템플릿에서 사용할 때
typename을 앞에 붙여야 한다. MyAllocList<T>::type은 의존 타입이기 때문이다.
- 편법을 쓰면, 클래스 템플릿에서 사용할 때
- 별칭 선언은 템플릿화할 수 있다.
MyAllocList<T>는 비의존 타입이다.
- 의존/비의존 타입에 대해선 이곳을 참고하자.
🧬 타입 특성 (Type Traits)
// C++11
std::remove_const<T>::type
std::remove_reference<T>::type
std::add_lvalue_reference<T>::type
// C++14 이후
std::remove_const_t<T>
std::remove_reference_t<T>
std::add_lvalue_reference_t<T>
- 템플릿 메타 프로그래밍(TMP)을 하다 보면 템플릿 타입 매개변수를 가공하는 경우가 존재한다.
const추가/제거- 참조 추가/제거
- 이 외의 경우
- 이러한 변환을 타입 특성(type traits) 을 통해 수행할 수 있는 도구를 제공한다.
- C++11: 반환 타입은
std::변환<T>::type이며, 템플릿 안에서 사용하려면typename접두사를 붙여야 한다. - C++14:
std::변환_t<T>형태이며, 별칭 템플릿을 사용한다.
- C++11: 반환 타입은
template<class T>
using remove_const_t = typename remove_const<T>::type;
template<class T>
using remove_reference_t = typename remove_reference<T>::type;
template<class T>
using add_lvalue_reference_t = typename add_lvalue_reference<T>::type;
- C++11에서도 별칭 템플릿을 직접 작성하여, C++14처럼 사용할 수 있다.
🧐 정리
typedef는 템플릿화를 지원하지 않지만, 별칭 선언은 지원한다.- 별칭 템플릿에서는
::type접미어를 붙일 필요가 없다.- 템플릿 내에서 사용하려면
typename접두사를 붙여야 하는 경우가 많다.
- 템플릿 내에서 사용하려면
- C++14는 C++11의 모든 타입 특성 변환에 대한 별칭 템플릿을 지원한다.
댓글남기기