Gitters const et non-const : une solution élégante
Les getters surchargés avec des variantes const et non-const présentent une énigme de programmation. L'implémentation directe de l'un à partir de l'autre entraîne des erreurs de compilation, obligeant les développeurs à recourir au casting. Existe-t-il une approche plus gracieuse ?
Le défi
Considérez la classe suivante avec les méthodes getSomething :
class Foobar { public: Something& getSomething(int index); const Something& getSomething(int index) const; };
Implémentation d'une méthode en utilisant l'autre n'est pas réalisable en raison de l'incapacité de la version const à appeler la version non const. Le casting est nécessaire, mais il semble fastidieux et peut prêter à confusion.
La solution : lancer avec prudence
Effective C suggère de supprimer le const de la fonction const pour implémentez la fonction non const. Bien que cela ne soit pas visuellement attrayant, il s’agit d’une approche sûre. Puisque la fonction membre non const est appelée, l'objet doit être non const et il est permis de supprimer le const.
Voici un exemple :
class Foo { public: const int& get() const; int& get(); }; const int& Foo::get() const { // Non-trivial work return foo; } int& Foo::get() { return const_cast<int&>(const_cast<const Foo*>(this)->get()); }
En suivant cette approche , vous pouvez réaliser des implémentations de getter const et non const de sécurité de type sans sacrifier les performances ni introduire de complexité inutile.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!