std::vector
использует кучу. Боже, какая трата, которая была бы только ради проверки безопасности. Точка 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) {
// todo: throw more appropriate out-of-bounds exception
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
.
Второе позволяет выделять массив внутри другой объект, который может находиться в куче или просто в стеке, если это объект. Нет никакой траты времени, выделяемого из кучи. Он также выполняет проверку целостности компиляции в массиве.
b_filler
- это небольшой частный класс, обеспечивающий значения инициализации. Размер массива проверяется во время компиляции с аргументами шаблона, поэтому нет возможности выйти за рамки.
Я уверен, что есть более экзотические способы изменить это. Это начальный удар. Я думаю, вы можете в значительной степени компенсировать любой недостаток компилятора с классами.
, что предполагает, что я действительно хочу, статический член, но это ISN всегда так. Я мог бы иметь массив const, который имеет разные значения для разных экземпляров класса, но значения никогда не меняются в течение жизненного цикла класса – 2008-10-02 11:48:46
, если ваш конструктор не принимает никаких параметров, тогда все экземпляры будут иметь одинаковые значения. Кроме этого, вы правы. – nus 2010-10-31 12:57:51
«Стандарт ISO C++ не позволяет вам» - это хорошая идея, чтобы указать, какую версию стандарта ISO C++ вы имеете в виду. – mloskot 2012-12-12 16:10:16