Template-Spezialisierung und Vererbung
Angenommen ich habe eine template-Klasse mit einer Menge von Funktionen, und ich möchte um sich zu spezialisieren, Sie zu ändern, nur ein paar von Ihnen und halten die anderen auf, genau so, wie angegeben in das Basis-template-Klasse.
Wie kann ich das tun?
Unten ist das, was ich erreichen will, aber die Lösung ist nicht gut, weil es nicht erlauben, mich zu finden um die Spezialisierung für int
als Base<int>
– ich IntSpec
für, die.
#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();
}
Ausgabe:
Base::print1
Base::print2
Base::print1
Base<int>::print2()
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicol ' s Lösung funktioniert gut, aber dies ist eine alternative:
Diese Weise können Sie spezialisieren sich nur auf bestimmte member-Funktionen, und diejenigen, die Sie noch nicht spezialisiert(in diesem Fall
print1
) ohne jedes problem. So, jetzt würden Sie es genau wie Sie wollte:Demo hier.
Sie nur verwenden Sie zwei template-Klassen:
Immer
Base
eher alsCommonBase
.Andere Lösung wäre, fügen Sie eine Ebene der Dereferenzierung in der Funktion, die Sie neu definieren möchten, d.h.
Dann können Sie spezialisieren sich jede Funktion individuell für jeden Typ oder spezialisieren sich das ganze geben wollte.