Modèle de la spécialisation et de l'héritage
Supposons que j'ai un modèle de classe avec beaucoup de fonctions et je veux me spécialiser à changer seulement quelques-uns d'entre eux et de garder les autres exactement comme spécifié dans le modèle de base de la classe.
Comment puis-je le faire?
Ci-dessous est ce que je veux réaliser, mais la solution n'est pas bonne, car elle ne me permet pas de se référer à la spécialisation pour int
comme Base<int>
– je besoin pour utiliser IntSpec
pour que.
#include <iostream>
using namespace std;
template<typename T>
struct Base
{
void print1() {cout << "Base::print1" << endl;};
void print2() {cout << "Base::print2" << endl;};
};
struct IntSpec : public Base<int>
{
void print2() {cout << "Base<int>::print2()" << endl;};
};
int main()
{
Base<double> d;
//Base<int> i; <-- I want this kind of instantiation
IntSpec i;
d.print1();
d.print2();
i.print1();
i.print2();
}
La sortie est:
Base::print1
Base::print2
Base::print1
Base<int>::print2()
Vous devez vous connecter pour publier un commentaire.
Nicol de la solution fonctionne très bien, mais c'est une alternative:
De cette façon, vous pouvez vous spécialiser uniquement des fonctions de membre et de toujours utiliser ceux que vous n'avez pas spécialisées(dans ce cas,
print1
) sans aucun problème. Donc, maintenant que vous souhaitez utiliser comme vous voulais:Démo ici.
Vous avez juste à utiliser deux classes de modèles:
Vous utilisez toujours
Base
, plutôt que deCommonBase
.Une autre solution serait d'ajouter un niveau d'indirection dans la fonction que vous souhaitez redéfinir, c'est à dire
Alors vous pouvez vous spécialiser chaque fonction séparément pour chaque type ou de se spécialiser tout type voulu.