std::vector
utilise le tas. Waow, quel gâchis ce serait juste pour le plaisir d'un const
santé mentale-case. Le point de std::vector
est une dynamique de croissance au moment de l'exécution, et non pas un vieux de la vérification de syntaxe qui doit être fait au moment de la compilation. Si vous n'allez pas à grandir alors créer une classe pour envelopper un tableau normal.
#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
et ConstFixedSizeArray
sont réutilisables.
La première permet d'exécution de la vérification de limites lors de l'initialisation de la matrice (même comme un vector), qui peut devenir plus tard l' const
après cette initialisation.
Le second permet la matrice soit allouée à l'intérieur d'un autre objet, qui pourrait être sur le tas ou tout simplement la pile si c'est l'emplacement de l'objet. Il n'y a pas de perte de temps de l'allocation dans le tas. Il effectue également au moment de la compilation const vérifier sur le tableau.
b_filler
, c'est un petit cours privé pour fournir les valeurs d'initialisation. La taille de la matrice est vérifié au moment de la compilation avec les arguments de modèle, donc il n'y a aucune chance de sortir des limites du terrain.
Je suis sûr qu'il y a de plus exotique des moyens de modifier cette. C'est un premier coup de couteau. Je pense que vous pouvez très bien faire pour tout le compilateur de la lacune de classes.