[Modern C++] 항목 9: typedef보다 별칭 선언을 선호하라

게시:     수정

카테고리:

태그: ,

이 글은 아래의 책을 정리하였습니다. 이펙티브 모던 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> 형태이며, 별칭 템플릿을 사용한다.
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의 모든 타입 특성 변환에 대한 별칭 템플릿을 지원한다.

Cpp 카테고리 내 다른 글 보러가기

댓글남기기