KoreanFoodie's Study
Effective Modern C++ | 항목 9 : typedef 보다 별칭 선언을 선호하라 본문
Tutorials/C++ : Advanced
Effective Modern C++ | 항목 9 : typedef 보다 별칭 선언을 선호하라
GoldGiver 2022. 10. 26. 09:52
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다!
항목 9 : typedef 보다 별칭 선언을 선호하라
핵심 :
1. typedef 은 템플릿화를 지원하지 않지만, using 은 지원한다.
2. 별칭 템플릿에서는 "::type" 접미어를 붙일 필요가 없다. 템플릿 안에서 typedef 을 지칭할 때에는 "typename" 접두사를 붙여야 하는 경우가 많다.
3. C++14 는 C++11 의 모든 형식 특질 변환에 대한 using 들을 제공한다.
typedef 과 using (별칭 선언, alias declaration) 이 하는 일은 동일하지만, using 이 더 직관적이다.
// 함수 포인터 형식 선언
typedef void (*FP)(int, const std::string&);
using FP2 = void (*)(int, const std::string&);
typedef 은 템플릿화 할 수 없지만 별칭 선언은 템플릿화할 수 있다. 템플릿화된 별칭 선언을 별칭 템플릿(alias templates) 이라고 부른다. 예시를 보자.
// 기존 typedef 버전
template<typename T>
struct MyAllocList {
typedef std::list<T, MyAlloc<T>> type;
};
// std::list<Widget, MyAllock<Widget>> lw;
MyAllocList<Widget>::type lw;
// 별칭 선언 버전이 더 간단하다!
template<typename T>
using MyAllocList = std::list<T, MyAlloc<T>>;
MyAllocList<Widget> lw;
// 해당 변수를 클래스 안에서 사용하는 예시
template<typename T>
class Widget {
private:
// typedef 버전을 쓰면,
// 중첩 의존 타입이므로 typename 을 붙여야 한다
typename MyAllocList<T>::type list1;
// using 을 쓰면 간단해진다
// 이는 별칭 선언은 해당 MyAllocList<T> 를 "반드시"
// 형식의 이름으로 간주하기 때문이다
MyAllocList<T> list2;
};
템플릿 메타프로그래밍(template metaprogramming, TMP) 를 하다 보면 템플릿 형식 매개변수를 받아 형식을 변경(참조자, const 제거 등)하는 경우가 많다. 이 때, typedef 과 ::type 을 매번 붙이는 번거롭고 말썽을 일으킬 수 있는 방식보다, C++14 에서 추가된 형식 변환에 대한 별칭 템플릿 버전들을 사용하자.
// 기존 typedef 형태
std::remove_const<T>::type; // const T 를 T 로
std::remove_reference<T>::type; // T&, T&& 를 T 로
std::add_lvalue_refernce<T>::type; // T 를 T& 로
// C++14에서 추가된, using 의 형태
std::remove_const_t<T>; // const T 를 T 로
std::remove_reference_t<T>; // T&, T&& 를 T 로
std::add_lvalue_refernce_t<T>; // T 를 T& 로
// typedef 에서 using 으로의 수정은 간단하다
// using 명세가 없을 경우 아래와 같이 직접 구현하면 된다
template<typename T>
using std::remove_const_t = typedef std::remove_const<T>::type;
'Tutorials > C++ : Advanced' 카테고리의 다른 글
Effective Modern C++ | 항목 11 : 정의되지 않은 비공개 함수보다 삭제된 함수를 선호하라 (0) | 2022.10.26 |
---|---|
Effective Modern C++ | 항목 10 : 범위 없는 enum 보다 범위 있는 enum 을 선호하라 (0) | 2022.10.26 |
Effective Modern C++ | 항목 8 : 0 과 NULL 보다 nullptr 를 선호하라 (0) | 2022.10.26 |
Effective Modern C++ | 항목 7 : 객체 생성 시 괄호'( )' 와 중괄호'{ }' 를 구분하라 (0) | 2022.10.26 |
Effective Modern C++ | 항목 6 : auto 가 원치 않은 형식으로 연역될 때는 명시적 형식의 초기치를 사용하라 (0) | 2022.10.26 |
Comments