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?


  • Administrator

    Es gibt viele Möglichkeiten, such dir eine aus:
    1. Du machst eine freie Funktion

    template<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.


Log in to reply