Const vectoriel d'objets non-const
Dans la définition d'une fonction dans une interface :
virtual void ModifyPreComputedCoeffs ( std::vector < IndexCoeffPair_t > & model_ ) = 0;
nous voulons préciser que le vecteur model_ ne doit pas être modifié dans le sens push_back etc opérations ne devrait pas être fait sur le vecteur, mais le IndexCoeffPair_t struct objets dans le model_ pourrait être changé.
Comment doit-on préciser que ?
virtual void ModifyPreComputedCoeffs ( const std::vector < IndexCoeffPair_t > & model_ ) = 0;
ne fonctionne pas je pense.
source d'informationauteur Humble Debugger
Vous devez vous connecter pour publier un commentaire.
Le C++ const-correctness concept est de l'OMI façon surfaite. Ce que tu viens de découvrir l'une des grandes limitations, c'est: il n'a pas d'échelle au niveau de la composition.
Pour être en mesure de créer un const vecteur de non-const objets que vous devez mettre en place votre propre type de vecteur. Notez que, par exemple, même la bibliothèque standard a dû mettre en place de nouveaux types de const_iterators.
Ma suggestion est d'utiliser const-correct où vous êtes forcés, et pas partout où vous le pouvez. En théorie, const exactitude devrait aider les programmeurs, mais à un coût très élevé en raison de la syntaxe et est très primitif (juste un peu, n'a pas d'échelle par la composition, même nécessite la duplication de code).
Aussi dans mon expérience, cette prétendue grande aide n'est pas vraiment gros... la plupart des erreurs qu'il a prises sont reliés à la const-correctness système lui-même, et pas à la logique du programme.
Jamais demandé pourquoi la plupart des langues (y compris ceux conçus après C++) ne pas mettre en œuvre cette idée?
Plutôt que de passer le vecteur dans la fonction, de faire ce que la bibliothèque standard de fait et de passer une paire d'itérateurs à la place.
Cela est susceptible d'être en C++14 std::dynarray.
En fait, si la taille est fixe au moment de la compilation que vous pouvez utiliser std::array. Mais il est probablement plus à l'utiliser pour des choses comme la programmation embarquée, des tampons, des matrices et ainsi de suite, aussi souvent que vous ne connaissez pas la taille souhaitée jusqu'à l'exécution, ou vous voulez qu'il soit configurable.
Si vous êtes en mesure de modifier
IndexCoeffPair_t
vous pouvez ajouter un peu de const fonctions de membre et de les utiliser pour modifier certains de ses membres en faisant les membres mutable en utilisant le mot-clé mutable. C'est une sorte de hack mais, puisque vous allez maintenant être en mesure de modifier le contenu d'unconst IndexCoeffPair_t
.Exemple:
Vous pouvez essayer de créer
const std::vector<YouType*>
. Vous ne pouvez pas modifier le vecteur, mais vous pouvez modifier les objets à l'intérieur de vecteur.Mais être précis parce que vous allez modifier des objets originaux et non des copies.
Utiliser des pointeurs intelligents ou raw pointeurs dépend de la vôtre cas d'utilisation: vous devez posséder un vecteur ou juste vecteur d'observateurs.