В дополнение к другим ответам следует отметить, что тест может использоваться во время выполнения, но также и во время компиляции, чтобы выбрать правильную реализацию в зависимости от того, является ли тип целым или нет:
Рабочая версия:
// Include either <boost/type_traits/is_integral.hpp> (if using Boost)
// or <type_traits> (if using c++1x)
// In the following, is_integral shoudl be prefixed by either boost:: or std::
template <typename T>
void algorithm(const T & t)
{
// some code
if (is_integral<T>::value)
{
// operations to perform if T is an integral type
}
else
{
// operations to perform if T is not an integral type
}
// some other code
}
Однако это решение можно улучшить, когда реализация алгоритма сильно зависит от теста. В этом случае у нас будет тест в верхней части функции, затем большой блок then
и большой блок else
. Обычный подход в этом случае - перегрузить функцию и заставить компилятор выбрать правильную реализацию, используя SFINAE. Самый простой способ сделать это - использовать boost::enable_if
:
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_integral.hpp>
template <typename T>
typename boost::enable_if<boost::is_integral<T> >::type
algorithm(const T & t)
{
// implementation for integral types
}
template <typename T>
typename boost::disable_if<boost::is_integral<T> >::type
algorithm(const T & t)
{
// implementation for non integral types
}
При вызове функции algorithm
компилятор "выберет" правильную реализацию в зависимости от того, является ли параметр шаблона целым или нет.