При написании шаблонной функции C ++ я должен проверить, что тип переменной, используемый этой функцией, является целочисленным. Если это так, это должно привести к ошибке компиляции.
template <class IT> void foo( IT first, IT last ) {
// check here that *first has integral type.
}
Проблема, с которой я столкнулся, заключается в том, что этот параметр шаблона функции является не просто используемым типом, а типом итератора.
К сожалению, в настоящее время я нахожусь в среде, где я не могу использовать ни C ++ 11, ни Boost, поэтому мне придется попробовать заново изобретать это колесо.
В итоге я проверил, что тип является целочисленным, определив указатель на массив, используя параметр размер массива. Это приводит к ошибке компиляции, если тип параметра не является целочисленным.
template <class IT> void foo( IT first, IT last ) {
int ( * fake_array_ptr )[*first]; // Error: size of array has non-integral type
}
Мой вопрос: есть ли другие явный способы проверить, является ли тип интегральным?
В итоге я проверил, что тип является целочисленным, определив указатель на массив, используя параметр размер массива. Это приводит к ошибке компиляции, если тип параметра не является целочисленным.
Это не портативный. Он может генерировать ошибку компиляции, даже если тип параметра является целочисленным, потому что размеры массива должны быть целочисленными константными выражениями. Вероятно, он компилируется в настоящее время, потому что ваш компилятор имеет массивы переменной длины C99 в качестве расширения и включен по умолчанию.
Существует конечное число переносных целочисленных типов. Явные специализации для каждого из них являются переносимым способом реализации is_integral
в C ++ 03.
template <typename T>
struct is_integral { static const bool value = false; };
template <>
struct is_integral<char> { static const bool value = true; };
template <>
struct is_integral<signed char> { static const bool value = true; };
template <>
struct is_integral<unsigned char> { static const bool value = true; };
template <>
struct is_integral<short> { static const bool value = true; };
// and so on
template <>
struct is_integral<unsigned long> { static const bool value = true; };
Чтобы вызвать ошибку компиляции, когда эта черта выдает false, нужно использовать static_assert
в C ++ 11 или BOOST_STATIC_ASSERT
, Есть предыдущий вопрос о как реализовать BOOST_STATIC_ASSERT
самостоятельно.
Других решений пока нет …