我使用的是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
即可进行比较。由于您之前检查过非负性,因此就不会溢出,因此很安全。