SFINAE funciona de manera diferente en casos de parámetros de plantilla tipo y no tipo
¿Por qué funciona este código?
template<
typename T,
std::enable_if_t<std::is_same<T, int>::value, T>* = nullptr>
void Add(T) {}
template<
typename T,
std::enable_if_t<!std::is_same<T, int>::value, T>* = nullptr>
void Add(T) {}
y puede distinguir correctamente entre estas dos llamadas:
Add(1);
Add(1.0);
mientras que el siguiente código si se compila da como resultadoredefinición de Add () ¿error?
template<
typename T,
typename = typename std::enable_if<std::is_same<T, int>::value, T>::type>
void Add(T) {}
template<
typename T,
typename = typename std::enable_if<!std::is_same<T, int>::value, T>::type>
void Add(T) {}
Entonces, si el parámetro de plantilla es type, entonces tenemos una redefinición de la función, si no es type, entonces todo está bien.