Предположим, что я написал:
template <typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
void foo() { std::cout << "T is integral." << std::endl; }
template <typename T>
void foo() { std::cout << "Any T." << std::endl; }
int main() { foo<short>(); }
Когда я скомпилирую это, я получаю ошибку об неоднозначности вызова (и нет ошибки, если, скажем, я заменю short
на float
). Как мне исправить этот код, чтобы получить верхнюю версию для интегральных типов и более низкую версию в противном случае?
Бонусные баллы, если ваше предложение масштабируется в случае нескольких специализированных версий foo()
в дополнение к общему.