Un peu plus verbeux que Meyers, mais je pourrais faire ceci:
class X {
private:
// This method MUST NOT be called except from boilerplate accessors.
Z &_getZ(size_t index) const {
return something;
}
// boilerplate accessors
public:
Z &getZ(size_t index) { return _getZ(index); }
const Z &getZ(size_t index) const { return _getZ(index); }
};
La méthode privée a la propriété indésirable qu'il renvoie d'un non-const Z& pour un const exemple, qui est pourquoi il est privé. Les méthodes privées peuvent casser les invariants de l'interface externe (dans ce cas, le désiré invariant est "un const objet ne peut pas être modifié via des références obtenues grâce à des objets qu'il a-un").
Notez que les commentaires font partie de la structure même du _getZ de l'interface spécifie qu'il n'est jamais valide pour l'appeler (à part les accesseurs, évidemment): il n'y a pas concevable d'avantages à le faire de toute façon, parce que c'est 1 plus de caractère de type et ne se traduira pas dans les plus petites ou plus de code. L'appel de la méthode est équivalent à l'appel de l'un des accesseurs avec un const_cast, et vous ne voulez pas le faire. Si vous êtes inquiet au sujet de faire des erreurs évidentes (et c'est un gros objectif), puis l'appeler const_cast_getZ au lieu de _getZ.
En passant, j'apprécie Meyers de la solution. Je n'ai pas d'objection philosophique. Personnellement, cependant, je préfère un tout petit peu de contrôlée de la répétition, et une méthode privée qui ne doit être appelé dans certains étroitement des conditions contrôlées, sur une méthode qui ressemble à un bruit de ligne. Choisissez votre poison et le bâton avec elle.
[Edit: Kevin a relevé à juste titre que _getZ voudrez peut-être appeler une autre méthode (dire generateZ) qui est const spécialisé de la même façon getZ est. Dans ce cas, _getZ serait de voir un const Z& et ont pour const_cast avant de revenir. C'est encore sûr, car le standard de l'accesseur politiques de tout, mais c'est pas extrêmement évident que c'est sécuritaire. En outre, si vous le faites, puis plus tard, changement generateZ toujours y revenir const, alors vous aussi besoin de changer getZ toujours y revenir const, mais le compilateur ne vais pas vous dire que vous faites.
Ce dernier point sur le compilateur est également vrai de Meyers est recommandé de modèle, mais le premier point à propos d'un non-évident const_cast ne l'est pas. Donc sur la balance, je pense que si _getZ s'avère besoin d'un const_cast pour sa valeur de retour, alors ce modèle perd beaucoup de sa valeur sur Meyers. Depuis, il souffre aussi des inconvénients par rapport aux Meyers, je pense que je voudrais passer à son dans cette situation. Refactoring de l'un à l'autre est facile-il n'affecte pas les autres code valide dans la classe, puisque seul le code non valide et le passe-partout des appels _getZ.]