(C++ : Template) enable_if

Posted by : at

Category : Cpp


template<bool b, typename T = void> struct enable_if
{
};

template<typename T> struct enable_if<true, T>
{
    typedef T type;
};

int main()
{
    enable_if<ture, int>::type t0;      // int
    enable_if<ture>::type t1;           // void
    enable_if<false, int> t2;           // error - type이 없다
    enable_if<fale>::type t3;           // error - type이 없다
}

Example

/*
// 정수일때만 함수 코드를 생성하고 싶다.
template<typename T> void foo(T a)
{
    static_assert(is_integeral<T>::value, "error");
}
*/
template<typename T> 
typename enable_if<is_integral<T>::value>::type
foo(T a)
{
    static_assert(is_integeral<T>::value, "error");
}

// 정수가 아니면 아래 함수에서 처리하고 싶다면?
void foo(...)
{
    cout << "not integer" << endl;
}

int main()
{
    foo(3.4);
}

Example - 2

// 정수가 아니면 에러를 발생하게 하고 싶다.
/*
template<typename T> void foo(T a)
{
    static_assert(is_integral<T>::value, "error");
}
*/
template<typename T> 
typename enable_if<is_integral<T>::value>::type
foo(T a)
{
}

template<typename T> 
void foo(T a, typename enable_if<is_integral<T>::value>::type* = nullptr)
{
}

template<typename T, 
        typename enable_if<is_integral<T>::value>::type* = nullptr> 
void foo(T a)
{
}

// 정수가 아니면 사용하지 않게 하고 싶다.

void foo(...){}

int main()
{
    foo(3.4);
}

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links