std::vector
використовує купу. Господи, що це було б марнотратством лише для const
перевірки стану розуму. Сенс - std::vector
це динамічне зростання під час виконання, а не будь-яка стара перевірка синтаксису, яку слід робити під час компіляції. Якщо ви не збираєтеся рости, створіть клас, щоб обернути звичайний масив.
#include <stdio.h>
template <class Type, size_t MaxLength>
class ConstFixedSizeArrayFiller {
private:
size_t length;
public:
ConstFixedSizeArrayFiller() : length(0) {
}
virtual ~ConstFixedSizeArrayFiller() {
}
virtual void Fill(Type *array) = 0;
protected:
void add_element(Type *array, const Type & element)
{
if(length >= MaxLength) {
throw 0;
}
array[length] = element;
length++;
}
};
template <class Type, size_t Length>
class ConstFixedSizeArray {
private:
Type array[Length];
public:
explicit ConstFixedSizeArray(
ConstFixedSizeArrayFiller<Type, Length> & filler
) {
filler.Fill(array);
}
const Type *Array() const {
return array;
}
size_t ArrayLength() const {
return Length;
}
};
class a {
private:
class b_filler : public ConstFixedSizeArrayFiller<int, 2> {
public:
virtual ~b_filler() {
}
virtual void Fill(int *array) {
add_element(array, 87);
add_element(array, 96);
}
};
const ConstFixedSizeArray<int, 2> b;
public:
a(void) : b(b_filler()) {
}
void print_items() {
size_t i;
for(i = 0; i < b.ArrayLength(); i++)
{
printf("%d\n", b.Array()[i]);
}
}
};
int main()
{
a x;
x.print_items();
return 0;
}
ConstFixedSizeArrayFiller
і ConstFixedSizeArray
є багаторазовими.
Перший дозволяє перевіряти межі часу виконання під час ініціалізації масиву (так само, як і вектор), який згодом може стати const
після цієї ініціалізації.
Другий дозволяє розподілити масив усередині іншого об’єкта, який може знаходитись у купі або просто у стеку, якщо там знаходиться об’єкт. Ви не витрачаєте часу на виділення з купи. Він також виконує перевірку const під час компіляції масиву.
b_filler
це крихітний приватний клас для надання значень ініціалізації. Розмір масиву перевіряється під час компіляції за допомогою аргументів шаблону, тому немає шансів вийти за межі.
Я впевнений, що існують більш екзотичні способи змінити це. Це початковий удар. Я думаю, ви можете майже компенсувати будь-який недолік компілятора класами.