Как правильно установить и получить переданные границы массивов в шаблоне (в C ++)?

Я пытаюсь создать массив с типом T, поэтому он может быть целым числом, двойным или любым другим. Затем я сделал так, чтобы 0 не было нижней границей, чтобы вы могли установить любую нижнюю границу и верхнюю границу, какую захотите. Проблема с этим кодом я нахожу в основной функции. Он не должен выводить значения за пределы диапазона, в который я его ввел, но это всегда происходит. Для этого кода должно быть 12 — 5 + 1 = 8 элементов, но индексы с 1 по 12 доступны и не должны быть. Любая помощь приветствуется.

#include <iostream>
using namespace std;

//L for lower-bound, U for upper-bound
template <typename T, int L, int U>
class LBArray
{
public:
LBArray()
{
data = new T[U - L + 1];
}
T& operator[](int index)
{
return data[index];
}
private:
T* data;
};

int main(int argc, char** argv)
{
LBArray<int, 5, 12> data1;
for (int x = 1; x < 13; x++)
{
data1[x] = x;
cout << endl << "data1[" << x << "] = " << data1[x];
}
return 0;
}

-4

Решение

Вы делаете слишком много работы. Одна вещь за один раз; один класс должен делать одно и только одно. Не путайте управление ресурсами и вычисления индекса. Просто создайте класс для обработки смещения вашего индекса и оставьте управление памятью кому-то другому:

template <typename T, std::size_t L, std::size_t U>
struct OffsetArray
{
static_assert(L < U, "Bad bounds");

static std::size_t const lower_bound = L;
static std::size_t const upper_bound = U;

T data[upper_bound - lower_bound];

T & operator[](std::size_t i) noexcept
{ return data[i - lower_bound]; }

T const & operator[](std::size_t i) const noexcept
{ return data[i - lower_bound]; }

std::size_t size() const noexcept
{ return upper_bound - lower_bound; }

// ...
};

Использование:

OffsetArray<int, 5, 13> x;
x[5] = 10;

Если вам нужны динамические контейнеры, вы всегда можете вставить массив в std::vector или что-то подобное.

2

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


По вопросам рекламы [email protected]