Удалить дублирование между (не) константной функцией-членом, возвращающей вектор указателей на (не) константные объекты

У меня есть две перегрузки функции-члена:

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*>,

ВотЭто скомпилированная версия приведенного выше кода для экспериментов.

Возможные решения:

  1. Сделайте дубликат кода макросом и используйте макрос в двух функциях.
  2. В неconst версия, использовать reinterpret_cast изгонять из std::vector<const Tile*> в std::vector<Tile*>:

    return reinterpret_cast<const std::vector<Tile*>&>(
    const_cast<const Level*>(this)->calculateTilesWithinAABB(Box));
    

    который компилируется и, кажется, работает. Но безопасно ли / гарантированно работать на всех основных компиляторах?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector