[2026] C++ `std::enable_if` | Conditional Templates and SFINAE

[2026] C++ `std::enable_if` | Conditional Templates and SFINAE

이 글의 핵심

`enable_if` / `enable_if_t` for SFINAE-friendly overloads: return types, default template parameters, and migrating toward C++20 concepts.

What is enable_if?

Conditionally enable template declarations when a predicate is true. 아래 코드는 cpp를 사용한 구현 예제입니다. 필요한 모듈을 import하고, 에러 처리를 통해 안정성을 확보합니다. 각 부분의 역할을 이해하면서 코드를 살펴보시기 바랍니다.

#include <type_traits>
template<typename T>
typename std::enable_if<std::is_integral<T>::value, T>::type
func(T value) {
    return value * 2;
}
func(10);     // OK: int
// func(3.14);  // error: double

Basic syntax

아래 코드는 cpp를 사용한 구현 예제입니다. 코드를 직접 실행해보면서 동작을 확인해보세요.

// enable_if<condition, type>::type
std::enable_if<true, int>::type   // int
std::enable_if<false, int>::type // no ::type (SFINAE)
// C++14 alias
std::enable_if_t<condition, type>

Examples

Return type

아래 코드는 cpp를 사용한 구현 예제입니다. 각 부분의 역할을 이해하면서 코드를 살펴보시기 바랍니다.

template<typename T>
std::enable_if_t<std::is_integral<T>::value, T>
multiply(T a, T b) {
    return a * b;
}
template<typename T>
std::enable_if_t<std::is_floating_point<T>::value, T>
multiply(T a, T b) {
    return a * b * 1.1;
}

Default template parameter

아래 코드는 cpp를 사용한 구현 예제입니다. 클래스를 정의하여 데이터와 기능을 캡슐화하며. 코드를 직접 실행해보면서 동작을 확인해보세요.

template<typename T, 
         typename = std::enable_if_t<std::is_arithmetic<T>::value>>
class Calculator {
    T value;
public:
    Calculator(T v) : value(v) {}
    T add(T x) { return value + x; }
};

Dummy function parameter

아래 코드는 cpp를 사용한 구현 예제입니다. 각 부분의 역할을 이해하면서 코드를 살펴보시기 바랍니다.

template<typename T>
void print(T value, 
           std::enable_if_t<std::is_pointer<T>::value>* = nullptr) {
    std::cout << "pointer: " << *value << std::endl;
}
template<typename T>
void print(T value,
           std::enable_if_t<!std::is_pointer<T>::value>* = nullptr) {
    std::cout << "value: " << value << std::endl;
}

Multiple conditions

아래 코드는 cpp를 사용한 구현 예제입니다. 코드를 직접 실행해보면서 동작을 확인해보세요.

template<typename T>
std::enable_if_t<
    std::is_integral<T>::value && 
    !std::is_same<T, bool>::value,
    T>
increment(T value) {
    return value + 1;
}

C++20 concepts alternative

아래 코드는 cpp를 사용한 구현 예제입니다. 코드를 직접 실행해보면서 동작을 확인해보세요.

template<typename T>
concept Integral = std::is_integral_v<T>;
template<Integral T>
T multiply(T a, T b) {
    return a * b;
}

Common pitfalls

  • Readability—prefer enable_if_t and concepts.
  • Overlapping predicates—make conditions mutually exclusive.
  • Error messages—add static_assert in a single overload if clearer.

Practical patterns

Pointers only, copy-constructible checks, sizeof bounds—same ideas as the Korean article.

FAQ

SFINAE: Substitution Failure Is Not An Error—failed substitution removes a candidate, it is not always an error.

Keywords

C++, enable_if, SFINAE, templates, metaprogramming.

See also

... 996 lines not shown ... Token usage: 63706/1000000; 936294 remaining Start-Sleep -Seconds 3