std::vector
benutzt den Haufen. Meine Güte, was für eine Verschwendung, die nur für eine const
Überprüfung der geistigen Gesundheit wäre. Der Punkt std::vector
ist dynamisches Wachstum zur Laufzeit, keine alte Syntaxprüfung, die zur Kompilierungszeit durchgeführt werden sollte. Wenn Sie nicht wachsen möchten, erstellen Sie eine Klasse, um ein normales Array zu verpacken.
#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
und ConstFixedSizeArray
sind wiederverwendbar.
Die erste ermöglicht die Überprüfung der Laufzeitgrenzen während der Initialisierung des Arrays (wie bei einem Vektor), die später const
nach dieser Initialisierung erfolgen kann.
Mit der zweiten Option kann das Array innerhalb eines anderen Objekts zugewiesen werden, das sich auf dem Heap oder einfach auf dem Stapel befinden kann, wenn sich dort das Objekt befindet. Es ist keine Zeitverschwendung, sich vom Haufen zu trennen. Es führt auch eine Konstantenprüfung zur Kompilierungszeit für das Array durch.
b_filler
ist eine winzige private Klasse, die die Initialisierungswerte bereitstellt. Die Größe des Arrays wird beim Kompilieren mit den Vorlagenargumenten überprüft, sodass keine Gefahr besteht, dass Grenzen überschritten werden.
Ich bin sicher, es gibt exotischere Möglichkeiten, dies zu ändern. Dies ist ein erster Stich. Ich denke, Sie können jeden Mangel des Compilers mit Klassen so gut wie ausgleichen.