Диспетчер тегов использует разрешение перегрузки для выбора правильной перегрузки.
auto f_impl(std::true_type) { return true; }
auto f_impl(std::false_type) { return std::string("No"); }
template <class T>
auto f(const T& t) {
return f_impl(std::is_integral<T>());
}
SFINAE отключает кандидата, делая его непригодным из-за ошибки замещения.
Ошибка замены - это то, что говорится вОлово: Попытка заменить конкретные аргументы для параметров шаблона и обнаружение ошибки, которая в непосредственном контексте отвергает только этого кандидата.
template <class T>
auto f(const T& t)
-> std::enable_if_t<std::is_integral_v<T>, bool> {
return true;
}
template <class T>
auto f(const T& t)
-> std::enable_if_t<!std::is_integral_v<T>, std::string> {
return std::string("No");
}
Иногда одну или другую технику легче применить. И, естественно, они могут быть объединены с большим эффектом.
Дополнительные методы являются частичной и полной специализации. Кроме того, if constexpr
часто может упростить вещи.