У меня есть две перегрузки функции-члена:
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;
}
Я хочу удалить дублированный закомментированный код. Как это можно сделать?
Есть связанный вопрос, Как удалить дублирование кода между похожими константными и неконстантными функциями-членами?, но решение не работает в этом случае, так как вы не можете использовать между std::vector<const T*>
а также std::vector<T*>
,
ВотЭто скомпилированная версия приведенного выше кода для экспериментов.
Возможные решения:
В неconst
версия, использовать reinterpret_cast
изгонять из std::vector<const Tile*>
в std::vector<Tile*>
:
return reinterpret_cast<const std::vector<Tile*>&>(
const_cast<const Level*>(this)->calculateTilesWithinAABB(Box));
который компилируется и, кажется, работает. Но безопасно ли / гарантированно работать на всех основных компиляторах?
Задача ещё не решена.
Других решений пока нет …