Если вы хотите, чтобы нецелочисленные типы вызывали ошибку компиляции, вы также можете утверждать статически (утверждения времени компиляции).
С C ++ 0x:
#include <utility>
template <class T>
void foo(T )
{
static_assert(std::is_integral<T>::value, "Only integral types allowed");
}
int main()
{
foo(3); //OK
foo(3.14); //makes assertion fail
}
СC ++ 03, boost поможет:
#include <boost/type_traits.hpp>
#include <boost/static_assert.hpp>
template <class T>
void foo(T )
{
BOOST_STATIC_ASSERT(boost::is_integral<T>::value);
}
int main()
{
foo(3);
foo(3.14);
}
(IMO, enable_if
- для сценариев, в которых вы хотите включить другую версию функции для других типов и избежать ошибки. Если вы хотитеошибка для всех других типов, когда функция отключена, вы можете просто получить не слишком полезное сообщение: «нет соответствующей функции для вызова», которая даже не указывает на место в коде, где нецелые числа запрещены.)