提升 ICL,间隔集的基数
Boost ICL, cardinality of an interval set
在 Boost ICL 中,当我在区间集上调用 cardinality() 或 size() 函数时,返回类型是 size_t,与区间类型无关。在 32 位计算机上,这是一个 32 位无符号整数。但是,如果我的间隔类型为 int64_t,则基数很容易溢出 32 位整数。我在这里错过了一些明显的东西,还是这是这个库的严重缺陷?
编辑:添加示例
以下代码在 64 位计算机上编译和运行,没有错误,但在引发断言的 32 位计算机上则不然。
#include <boost/icl/interval_set.hpp>
int main()
{
boost::icl::interval_set<int64_t> is;
is.add(boost::icl::interval<int64_t>::closed(1, 4294967297LL));
assert(boost::icl::cardinality(is) == 4294967297LL);
}
编辑:我在 Ubuntu 1.49.0 上使用 boost::icl 版本 13.10
编辑:
这不是一个特别的 32/64 位问题,因为以下代码在 64 位上也不起作用
#include <boost/icl/interval_set.hpp>
int main()
{
boost::icl::interval_set<double> is;
is.add(boost::icl::interval<double>::closed(1, 1.5));
assert(boost::icl::cardinality(is) == 0.5);
}
在 Ubuntu 14.04.1 LTS 上使用 Boost 1_54 转载
这似乎确实是一个错误。要修复的专业化是
template <class Type>
struct get_size_type<Type, false, false, false>
{
typedef std::size_t type;
};
在icl/type_traits/size_type_of.hpp
.不知何故,ICL 开发人员这些天似乎没有使用 -m32 进行测试。
我已经成功地将其替换为
// BEGIN SEHE WAS HERE
template <class Type>
struct get_size_type<Type, std::enable_if<not boost::is_arithmetic<Type>::value, mpl::false_>::type::value, false, false>
{
typedef std::size_t type;
};
template <class Type>
struct get_size_type<Type, std::enable_if<boost::is_arithmetic<Type>::value, mpl::false_>::type::value, false, false>
{
typedef typename std::common_type<Type, std::size_t>::type type;
};
// END SEHE WAS HERE
可悲的是,该特征对 SFINAE 不是很友好,因此黑客使用 SFINAE 的第一个bool
模板参数。改进可能是:
- 仅使用
boost
类型特征
使用从 Boost 整数中扣除的整数值 - ,而不是对整数类型使用
common_type<...>
我已经在 DoTheRightThing(TM) 上进行了测试,interval_set<double>
并在 g++ -m32 和 -m64 上进行了interval_set<uint64_t>
测试。
我会在邮件列表中报告这一点。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 提升 ASIO 无法识别计时器对象
- 提升精神:解析布尔表达式并简化为规范范式
- 如何克服提升精神AST混乱
- 缓慢提升ASIO
- 我可以把基础班提升为儿童班吗
- 提升反序列化对象具有 nan 或 -nan 值
- 在 Mac 上的 python 上提升
- 提升 Asio TCP 服务器 处理多个客户端
- 使用提升将数据从 PyObject 复制到浮点数 *
- 是否可以配置提升日志刷新?
- 提升精神 x3 - 懒惰解析器
- 提升几何体:C++并集多个多边形
- 提升几何体:assertion_failed错误C++
- 提升 ASIO - io_service 不要等待连接到线程
- 提升 1.64 单元测试编译失败
- 每次进行继承时都需要提升::序列化::base_object吗?
- 提升图广度优先搜索前置编译错误
- 提升,以分钟精度获得 UTC 时间
- 提升 ICL,间隔集的基数