1

在编写 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
}

我的问题是:还有其他更明确的方法来测试一个类型是否是整数?

4

1 回答 1

3

我最终通过使用参数数组大小定义指向数组的指针来测试该类型是否是整数。如果参数类型是非整数,这会产生编译错误。

这不是便携式的。即使参数类型是整数,它也会产生编译错误,因为数组大小必须是整数常量表达式。它目前可能正在编译,因为您的编译器具有 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; };

为了在此 trait 产生 false 时导致编译错误,可以static_assert在 C++11 中使用,或者BOOST_STATIC_ASSERT. 之前有一个关于如何BOOST_STATIC_ASSERT自行实现的问题。

于 2013-03-27T10:50:52.750 回答