Boost签名/无符号比较size_type和multi_array的索引

时间:2012-02-13 12:59:00

标签: c++ boost multidimensional-array integer boost-multi-array

我正在使用boost::multi_array,当我需要检查给定坐标是否在边界内时,我这样做:

bool MapData::IsWithinBounds(TileArray3D::index x, TileArray3D::index y, TileArray3D::index z) const {
    return (x >= 0 and x < GetWidth()) and
           (y >= 0 and y < GetHeight()) and
           (z >= 0 and z < GetDepth());
}

其中TileArray3D定义为:

typedef boost::multi_array<TileID, 3> TileArray3D;

TileID是:

BOOST_STRONG_TYPEDEF(int, TileID);

GetWidth / Height / depth的签名是:

TileArray3D::size_type GetWidth() const;

TileArray3D::size_type未签名且TileArray3D::index已签名。我是以错误的方式使用这些类型吗?或者有办法解决这个问题吗?我应该将index转换为size_type吗?或者会出现问题?

先谢谢,等等。

1 个答案:

答案 0 :(得分:1)

如果size_type的大小至少与index的大小一样大,则只需将索引转换为size_type进行该比较。既然您之前检查过非负性,那么就不会溢出,所以它是安全的。