在关于数组中幻数的this问题中,paxdiablo说除-1,0和1之外的任何数字都是幻数。我知道这只是一个指导方针,但我想知道在指定多维数组的维度时是否需要定义哪个维度为x,y和z的常量。例如,这没关系:
typedef boost::multi_array<TileID, 3> TileArray3D;
TileArray3D::size_type GoRPG::MapData::GetWidth() {
return mData.shape()[0];
}
或者这是首选:
TileArray3D::size_type GoRPG::MapData::GetWidth() {
return mData.shape()[x_dimension];
}
先谢谢,等等。
编辑:长度存储在数组中的原因是因为我使用的是Boost :: multi_array,这就是它们的存储方式。为破碎的代码道歉!我可以稍后解决这个问题 - 目前我只是想了解这些神奇的数字,虽然它仍然有用,谢谢!
答案 0 :(得分:2)
不,魔术数字是不明显的。 -1
,0
和1
通常很明显,但并非总是如此。
在你的情况下,你的片段对我来说都不是很明显。为什么地图数据的宽度存储在数组中?
如果没有看到更多代码,我宁愿这样做:
auto GoRPG::MapData::GetWidth() {
return mData.shape()[width_index];
}
答案 1 :(得分:1)
我认为你应该为这种情况定义一个常量,而不是使用数字。在访问第一个元素是直观的事情的情况下,0并不总是“魔术”。示例:检查字符串的第一个字节,没有理由定义c_first_byte
常量。)
但是在你的代码中,最好添加一个方法来形成一个名为x()
的mData,它返回你想要的值。无需向其用户公开mData
或shape
的内部表示。
答案 2 :(得分:1)
但代码不能编译。因为,您没有使用decltype来推断返回类型。所有形状都有相同的宽度吗?
如果是,那么应该没问题。如果没有,那么更好的方法是提供默认参数。
auto MapData::GetWidth(const size_t index = 0) -> decltype( mData.shape()[0]) {
return mData.shape()[index];
}