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
在初始化之后使用。
第二个允许将数组分配到另一个对象内,该对象可以在堆上,或者如果是对象所在的地方,则可以只是堆栈。从堆分配资源没有浪费时间。它还在数组上执行编译时常量检查。
b_filler
是提供初始化值的微型私有类。数组的大小是在编译时使用模板参数进行检查的,因此不会超出范围。
我敢肯定,还有更多异国情调的方法可以对此进行修改。这是最初的刺伤。我认为您几乎可以弥补编译器类的缺点。