SFINAE — Substitution Failure Is Not An Error.
When template argument deduction fails, the overload is silently removed.
1// Enable if T has a size() method2template <typename T>3auto print_size(const T& t) -> decltype(t.size()) {4 return t.size();5}67// Falls back to this if SFINAE fails8void print_size(...) {9 std::cout << "no size()";10}
Modern alternative — std::enable_if:
1template <typename T>2std::enable_if_t<std::is_integral_v<T>, T>3double_value(T x) { return x * 2; }
Even better — C++20 concepts:
1template <typename T>2concept HasSize = requires(T t) { t.size(); };34void print(HasSize auto const& c) { std::cout << c.size(); }
**Use concepts over SFINAE for clarity.