Почему этот код работает:
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) {}
и может правильно различать эти два вызова:
Add(1);
Add(1.0);
в то время как следующий код, если скомпилирован, приводит к переопределению ошибки Add()?
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) {}
Итак, если параметр шаблона является типом, тогда мы переопределяем функцию, если она не является типом, тогда все в порядке.