[모던C++입문] 5.2 타입정보 제공하기 및 사용하기

    5.2 타입 정보 제공하기 및 사용하기

    타입 특성

    template<typename T>
    T inline min_magnitude(const T& x, const T& y)
    {
        using std::abs;
        T ax = abs(x), ay = abs(y);
        return ax < ay ? x : y;
    }
    
    double d1 = 3., d2 = 4.;
    cout << min_magnitude(d1, d2) << endl;  //가능
    
    std::complex<double> c1(3.), c2(4.);
    cout << min_magnitude(c1, c2) << endl;  //오류 operator < 관련
    
    //C++11이상에서는 컴파일러에 임시변수의 타입을 추론하라고 맡길 수 있음
    
    template<typename T>
    T inline min_magnitude(const T& x, const T& y)
    {
        using std::abs;
        auto ax = abs(x), ay = abs(y);
        return ax < ay ? x : y;
    }
    • C++는 타입특성(Type Trait)을 통해 타입의 속성을 제공
    //타입을 모를땐 T의 크기 타입은 T라고 가정
    template<typename T>
    struct Magnitude
    {
        using type = T;
    }
    
    //모든 complex타입에 대한 부분 특수화
    template<T>
    struct Magnitude<std::complex<T>>
    {
        using type = T;
    }
    
    //이제 다음과 같이 사용가능
    template<typename T>
    T inline min_magnitude(const T& x, const T& y)
    {
        using std::abs;
        typename Magnitude<T>::type ax = abs(x), ay = abs(y);
        return ax < ay ? x : y;
    }

    조건부 예외 처리

    • noexcept는 함수가 예외를 던질 수 없다는걸 나타낸다
    • 예외처리 코드를 생성치 않고 예외가 발생할 경우 프로그램을 죽이거나 정의되지 않은 행동을 유발

    표준 타입 특성

    • C++ 표준 타입 특성은 Boost 라이브러리 콜렉션에서 비롯됨
    • Boost 타입 특성에서 C++ 표준 타입 특성으로 옮길때 일부 이름이 다르거나 동작이 다른 부분이 있다.

    도메인 타입의 특성

    //is_matrix 속성을 구현하기 위해 명시적인 matrix 타입이 아니면 기본적으로는 false인 선언을 먼저 한다.
    template<typename T>
    struct is_matrix
    {
        static const bool value = false;
    };
    
    //표준 라이브러리는 위 정적 상수만 포함하는 false_type을 제공
    template<typename T>
    struct is_matrix
        : std::false_type
    { };
    
    //이제 모든 행렬 클래스에 대해 특수화 한다
    template<typename Value, typename Param>
    struct is_matrix<mtl::dense2d<Value, Param>>
        : std::true_type
    { };

    enable_if

    • enable_if는 Jaakko Jarvi와 Jeremiah Wilcock이 발견
    • enable_if는 SFINAE(Substitution Failure Is Not An Error) 법칙을 기반
    • 인수타입으로 추론할 수 없는 헤더를 갖는 함수 템플릿은 무시하며 오류를 발생시키지 않는다.
    반응형

    댓글

    Designed by JB FACTORY