Le problème et comment le surmonter en C++
Le problème a été explique largement par pat et Mat. Le compilateur est fondamentalement ignorant la première dimension de la taille du tableau efficacement en ignorant la taille de l'argument passé.
En C++, d'autre part, vous pouvez facilement surmonter cette limitation de deux façons:
- à l'aide de références
- à l'aide de
std::array
(depuis C++11)
Références
Si votre fonction est seulement d'essayer de lire ou de modifier un groupe existant (pas la copie), vous pouvez facilement utiliser des références.
Par exemple, supposons que vous voulez avoir une fonction qui permet de réinitialiser un ensemble de dix int
s réglage de chaque élément d' 0
. Vous pouvez facilement le faire en utilisant la fonction suivante signature:
void reset(int (&array)[10]) { ... }
Non seulement cela va fonctionner très bien, mais il permettra également de faire respecter la dimension de la matrice.
Vous pouvez également faire usage de modèles pour rendre le code ci-dessus générique:
template<class Type, std::size_t N>
void reset(Type (&array)[N]) { ... }
Et enfin, vous pouvez profiter de l' const
d'exactitude. Considérons une fonction qui imprime un tableau de 10 éléments:
void show(const int (&array)[10]) { ... }
Par l'application de l' const
qualificatif de nous prévenir d'éventuelles modifications.
La bibliothèque standard de classe pour les tableaux
Si vous considérez la syntaxe ci-dessus à la fois laid et inutile, comme je le fais, nous pouvons jeter dans le pouvez et de les utiliser std::array
à la place (depuis C++11).
Voici la refactorisation de code:
void reset(std::array<int, 10>& array) { ... }
void show(std::array<int, 10> const& array) { ... }
N'est-il pas merveilleux? Pour ne pas mentionner que le code générique truc que j'ai appris plus tôt, fonctionne encore:
template<class Type, std::size_t N>
void reset(std::array<Type, N>& array) { ... }
template<class Type, std::size_t N>
void show(const std::array<Type, N>& array) { ... }
Non seulement cela, mais vous obtenez de copie et de déplacement sémantique pour gratuit. :)
void copy(std::array<Type, N> array) {
// a copy of the original passed array
// is made and can be dealt with indipendently
// from the original
}
Alors, qu'attendez-vous pour? Go utiliser std::array
.