【问题标题】:How do I test if an iterator value has integral type?如何测试迭代器值是否具有整数类型?
【发布时间】:2013-03-27 08:30:40
【问题描述】:

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

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

【问题讨论】:

  • "注意:我不能使用 C++11,也不能使用 Boost。" -- 为什么?请告诉我你不能使用 Boost 的充分理由。
  • @DidierTrosset 看来您必须实现自己的 is_integral 模板。
  • 来吧伙计们,事情没那么简单。在项目中使用第三方库有法律上的影响——我知道我们认为这很愚蠢,但对法律人员来说,这种事情非常重要。很多时候,有人认为 Boost 过于依赖。如果“没有 Boost”作为要求,那么答案不应该是“无论如何都要使用它”。
  • @Xeo:是的,直到你的经理审查它并说“你认为你在做什么”。抱歉,有时我们必须处理这种称为“现实世界”的想法,它的行为并不总是如您所愿。
  • @BartekBanachewicz:不是吗?也许有一天,当你遇到我所说的这个现实世界时。如果您的老板告诉您“不要使用 boost”,然后您将 boost 代码复制/粘贴到您的项目中,他会很生气。理所当然的。如果你的团队决定不使用 boost,那么即使你不喜欢它,你也要坚持下去。因为其他任何事情都是混蛋

标签: c++ templates iterator integer typechecking


【解决方案1】:

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

这不是便携式的。即使参数类型是整数,它也会产生编译错误,因为数组大小必须是整数常量表达式。它目前可能正在编译,因为您的编译器具有 C99 可变长度数组作为扩展,并且默认启用它。

可移植整数类型的数量是有限的。其中每一个的显式特化是在 C++03 中实现 is_integral 的一种可移植方式。

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 时导致编译错误,可以在 C++11 中使用 static_assertBOOST_STATIC_ASSERT。之前有一个关于how to implement BOOST_STATIC_ASSERT on your own的问题。

【讨论】:

  • 看起来不错,但是如何将它与我的迭代器类型一起使用?我没有直接使用is_integral&lt;TYPE&gt;::value的类型,只有迭代器类型IT。
  • typename std::iterator_traits&lt;IT&gt;::value_type 应该为您提供在测试中使用的适当类型。
猜你喜欢
  • 2018-05-16
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 2012-08-15
  • 2017-12-12
  • 1970-01-01
  • 2020-01-14
  • 2016-05-09
相关资源
最近更新 更多