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;

 

Comments