我有一个成员函数的两个重载:
const std::vector<Tile*>& Level::calculateTilesWithinAABB(const gm::AABB& Box)
{
static std::vector<Tile*> Tiles;
Tiles.clear();
/* Calculations to add pointers to elements
in member std::vector<Tile> to Tiles: */
auto Pos = pxToGridPos(Box.getTopLeft());
auto Top = pxToGridPos(Box.getTop());
auto Right = pxToGridPos(Box.getRight());
auto Bottom = pxToGridPos(Box.getBottom());
for (; Pos.x <= Right; ++Pos.x)
for (Pos.y = Top; Pos.y <= Bottom; ++Pos.y)
if (Pos.x < mSize.x && Pos.y < mSize.y)
Tiles.push_back(&getTileAtPos(Pos));
return Tiles;
}
const std::vector<const Tile*>& Level::calculateTilesWithinAABB(const gm::AABB& Box) const
{
static std::vector<const Tile*> Tiles;
Tiles.clear();
/* Same duplicated code. */
return Tiles;
}
我想删除重复注释掉的代码。怎么办呢?
有一个相关的问题,How do I remove code duplication between similar const and non-const member functions?,但解决方案在这种情况下不起作用,因为您无法在std::vector<const T*>
和std::vector<T*>
之间进行投射。
Here是上述试验代码的可编译版本。
可能的解决方案:
在非const
版本中,使用reinterpret_cast
从std::vector<const Tile*>
投射到std::vector<Tile*>
:
return reinterpret_cast<const std::vector<Tile*>&>(
const_cast<const Level*>(this)->calculateTilesWithinAABB(Box));
编译并且似乎有效。但是对所有主要编译器都有效吗?