Code Reuse Templates
-
Hallo!
Ich habe folgendes Problem: Ich habe zwei Klassen-Templates codiert:
template<typename T> class CDat : public IDat<T> { private: CProg<int> prog; void exec() { //führe befehle aus, die in der membervariable prog stehen mit dem Typ int } public: void parse(string file1, bool mem, string file2) { //parse das file1 und das file2, falls mem1 true } };template<typename T> class CDatSet : public IDat<T> { private: CProg<MyOwnType> prog; void exec() { //führe befehle aus, die in der membervariable prog stehen mit dem Typ MyOwnType } public: void parse(string file1, bool mem, string file2) { //parse das file1 und das file2, falls mem1 true } };template<typename T> class IDat { public: virtual void parse(string file1, bool mem, string file2)=0; virtual void exec()=0; };Das Problem betrifft jetzt die Methode exec. Bei dieser wird eigentlich immer das selbe gemacht, nur hat einmal die member-variable den typ CProg<MyOwnType> bzw. CProg<int>.
In IDat kann ich diese Methode ja nicht geben, weil es dort noch nicht die Member-Variable prog habe...Wie könnte ich das sonst lösen? Jemand eine Idee, damit der Code nicht doppelt dort codiert werden muss?
-
Es gibt viele Möglichkeiten, such dir eine aus:
1. Du machst eine freie Funktiontemplate<typename T> void exec_impl(CProg<T>& prog) { // ... }Kann man auch in einem detail Namensraum verpacken.
2. Du machst eine statische Methode in IDat
template<typename T> class IDat { protected: template<typename X> static void exec_impl(CProg<X>& prog) { // ... } public: virtual void parse(string file1, bool mem, string file2)=0; virtual void exec()=0; };-> Muss auch nicht unbedingt statisch sein

3. Du erweiterst IDat
template<typename T, typename ProgParamT> class IDat { private: CProg<ProgParamT> prog; public: virtual void parse(string file1, bool mem, string file2)=0; void exec() { // ... } };-> Der zusätzliche Templateparameter könnte man auch für eine Funktion in IDat verwenden. Also eine Kombination mit 2.
Wahrscheinlich gibt es noch mehr Möglichkeiten, aber habe Kopfweh und bin müde

Grüssli
-
Du kannst eine "virtual pure" Methode ins Interface packen, und diese dann in der abgeleiteten Klasse implementieren.