Возможная реализация для std::enable_if
-
template <bool cond, typename T = void> struct enable_if;
template <typename T> struct enable_if<false, T>{};
template <typename T> struct enable_if<true, T>{ using type = T; };
Так что enable_if
не вызывает серьезных ошибок. экземпляр std::enable_if<false>
действителен.
Создание экземпляра Helper<Empty>
приводит к ошибке Empty::type
, которая не выполняется в непосредственном контексте SFINAE , поэтому серьезная ошибка.
std::enable_if
и std::void_t
хорошо работают с SFINAE, поскольку они обеспечивают простой способ сбоя в ближайшем контексте:
std::enable_if<cond_v<T>, int>::type = 0
или typename AlwaysVoid = std::void_t<decltype(dependent_expression)>
.