2. Techniques

여러 C++ 기법들을 알아보자.

2.1. Compile-Time Assertions

static_assert를 쓴다.

2.2. Partial Template Specialization

부분 템플릿 특수화는 템플릿의 가능한 인스턴스화 집합의 부분집합에 대해 클래스 템플릿을 특수화할 수 있게 해 준다. 여러 템플릿 인자가 있을 때 한 템플릿 인자만 고정시킨다던가 하는 식으로 부분적 특수화가 가능하다. 클래스 템플릿의 멤버 함수들을 완전히 특수화할 수는 있지만, 멤버 함수를 부분 특수화하는 것은 불가능하다. 네임스페이스 레벨 비멤버 템플릿 함수는 부분 특수화할 수 없다. 근접한 것은 템플릿 오버로딩일 것이다.

2.3. Local Classes

클래스 선언은 함수 내에서도 이루어질 수 있는데 이것을 로컬 클래스라 한다. 로컬 클래스를 쓰는 코드는 함수 밖에서 템플릿 클래스로 구현할 수 있다. 로컬 클래스는 파생될 수 없다.

2.4. Mapping Integral Constants to Types

std::integral_constant를 쓰면 정수형 상수를 템플릿 타입화할 수 있다.

2.5. Type-to-Type Mapping

템플릿 함수에 대한 부분 특수화는 할 수 없지만, 자료형간 매핑을 하는 간단한 템플릿을 만들어서 이를 해결할 수 있다. 다음과 같이 하면 된다.

template <typename T>
struct T2T {
    using orig_type = T;
};

template <typename T, typename U>
T* Create(const U& arg, T2T<T>) {
    return new T(arg);
}

template <typename U>
Widget* Create(const U& arg, T2T<Widget>) {
    return new Widget(arg, -1);
}

2.6. Type Selection

템플릿 인자의 특수화를 통해 value_type을 특수화할 수 있다.

2.7. Detecting Convertibility and Inheritance at Compile Time

std::is_convertible_v, std::is_base_of_v를 쓰면 컴파일 타임에 형변환 가능성과 상속을 체크할 수 있다.

2.8. A Wrapper Around type_info

decltype으로 오브젝트 타입을 조사할 수 있다.

2.9. NullType and EmptyType

빈 타입을 만들어 활용할 수 있다.

2.10. Type Traits

여러 타입 특성들이 존재한다

2.10.1. Implementing Pointer Traits

std::pointer_traits를 사용하자.

2.10.2. Detection of Fundamental Types

std::is_fundamental_v로 체크한다.

2.10.3. Optimized Parameter Types

파라미터 타입을 참조자로, 스칼라는 값으로 하고 싶을 때 std::remove_cvref_t, std::add_reference_t 등을 쓸 수 있다.

2.10.4. Stripping Qualifiers

std::remove_cv_t를 쓸 수 있다.

2.10.5. using TypeTraits

<type_traits>를 잘 활용하자.

2.11. Summary

위의 요소중 많은 요소들은 C++11부터 표준으로 편입되었다.