我使用的是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?还是会发生问题?

预先感谢,ell。

最佳答案

如果size_type的大小至少等于index的大小,则只需将索引转换为size_type即可进行比较。由于您之前检查过非负性,因此就不会溢出,因此很安全。

10-06 00:29