Предпочтительным является следующее:
template<typename T>
bool isNotZero(const T &a)
{
if (std::is_floating_point<T>::value) return abs(a) > std::numeric_limits<T>::epsilon();
else return a;
}
Или это:?
template<typename T>
std::enable_if<std::is_floating_point<T>::value, bool>::type
isNotZero(const T &a) { return abs(a) > std::numeric_limits<T>::epsilon(); }
template<typename T>
std::enable_if<std::is_integral<T>::value, bool>::type
isNotZero(const T &a) { return a; }
Обычно я использую первый тип, чтобы избежать многих версий функции.
Я считаю, что это точно то же самое.
Первая версия оптимизирована на этапе кода операции и вторая версия в стадии создания шаблона.