Comment à ce sujet:
template<typename IN, typename OUT>
OUT BigChunk(IN self, int index) {
// big, non-trivial chunk of code...
return something;
}
struct FooBar {
Something &getSomething(int index) {
return BigChunk<FooBar*, Something&>(this,index);
}
const Something &getSomething(int index) const {
return BigChunk<const FooBar*, const Something&>(this,index);
}
};
Évidemment, vous aurez toujours de l'objet de la duplication de code, mais pas de source de duplication de code. Contrairement à la const_cast approche, le compilateur vérifiera votre const-correctness pour les deux versions de la méthode.
Vous avez probablement besoin de déclarer les deux instanciations de BigChunk comme des amis de la classe. C'est une bonne utilisation de l'ami, puisque l'ami des fonctions sont cachés à proximité de la friendee, donc il n'y a pas de risque de contrainte de couplage (ooh-er!). Mais je ne chercherai pas la syntaxe pour le faire dès maintenant. N'hésitez pas à ajouter.
Les Chances sont que BigChunk besoins de respect de soi, auquel cas l'ordre ci-dessus de définition ne va pas fonctionner très bien, et les déclarations seront nécessaires pour faire le tri.
Aussi, afin d'éviter certains numpty trouver BigChunk dans l'en-tête et de décider d'instancier et de l'appeler, même si c'est moralement privé, vous pouvez déplacer l'ensemble du lot dans le fichier cpp pour FooBar. Dans un espace de noms anonymes. Avec une liaison interne. Et un signe en disant: "méfiez-vous du léopard".