C ++配列は、Pascalのようにカスタム境界をサポートしていません。それらは常にインデックス0で始まり、インデックス長-1で終わります。Pascalのようなインデックスが必要な場合は、自分で実装する必要があります。例:
template<typename T, const int LowBound, const int HighBound>
class RangedArray
{
private:
T m_arr[HighBound-LowBound+1];
void CheckBounds(const int index)
{
if ((index < LowBound) || (index > HighBound))
throw std::out_of_range();
}
public:
int low() const { return LowBound; }
int high() const { return HighBound; }
T operator[](const int index) const
{
CheckBounds(index);
return m_arr[index-LowBound];
}
T& operator[](const int index)
{
CheckBounds(index);
return m_arr[index-LowBound];
}
};
。
RangedArray<char, 20, 40> arr;
arr[20] // OK
arr[15] // out of bounds
arr[60] // out of bounds
より動的なものが必要な場合は、代わりにこれを試してください。
template<typename T, const int LowBound>
class RangedVector
{
private:
std::vector<T> m_vec;
void CheckBounds(const int index)
{
if ((index < low()) || (index > high()))
throw std::out_of_range();
}
public:
int low() const { return LowBound; }
int high() const { return m_vec.empty() ? -1 : (LowBound + m_vec.size() - 1); }
void setHighBound(const int HighBound)
{
if (HighBound < LowBound)
throw something;
m_vec.resize(HighBound-LowBound+1);
}
void push_back(const T &value)
{
m_vec.push_back(value);
}
T operator[](const int index) const
{
CheckBounds(index);
return m_vec[index-LowBound];
}
T& operator[](const int index)
{
CheckBounds(index);
return m_vec[index-LowBound];
}
};
。
RangedVector<char, 20> arr;
arr.setHighBound(40);
arr[20] // OK
arr[15] // out of bounds
arr[60] // out of bounds