Virtuelle template Funktionen in Klassen



  • Hi,
    ich wollte wissen ob und wie man in C++ virtual template functions in einer class erstellen kann.

    Meine Idee dafür sieht so aus:

    class CFile
    {
        public:
            CFile();
            virtual ~CFile();
            virtual template <typename T> void write(T Value) = 0; // Geht das bzw. geht das so?
    };
    
    class CFileHDD : public CFile
    {
        public:
            CFileHDD();
            ~CFileHDD();
            template <typename T> void write(T Value)
            {
                fwrite(&Value, 1, sizeof(T), m_Handle);
            }
        private:
            FILE* m_Handle;
    };
    
    class CFileRAM : public CFile
    {
        public:
            CFileRAM();
            ~CFileRAM();
            template <typename T> void write(T Value)
            {
                char* NewBuffer = (char*)&Value;
                for (int i = 0; i < sizeof(T); ++i, ++NewBuffer)
                    m_Buffer.push_back(*NewBuffer);
            }
        private:
            std::vector<char> m_Buffer;
    };
    

    Kann mir da bitte jemand was zu sagen und mir helfen?



  • LukasBanana schrieb:

    Hi,
    ich wollte wissen ob und wie man in C++ virtual template functions in einer class erstellen kann.

    Ganz kurze Antwort: nein.
    Es wäre quasi unmöglich, dafür z.B. eine vtable zu implementieren.



  • Wie pumuckl schon sagte kann es keine virtuellen Funktions-Templates geben.

    Die (vermutlich eh offensichtliche) 08/15 "Lösung":

    class CFile
    {
        public:
            CFile();
            virtual ~CFile();
    
            template <typename T> void write(T const& value)
            {
                write_impl(&value, sizeof(value));
            } 
    
        private:
            virtual void write_impl(void const* data, size_t size) = 0;
    };
    
    class CFileHDD : public CFile
    {
            virtual void write_impl(void const* data, size_t size)
            {
                fwrite(data, 1, size, m_Handle);
            }
    
            FILE* m_Handle;
    };
    
    class CFileRAM : public CFile
    {
            virtual void write_impl(void const* data, size_t size)
            {
                char const* pc = static_cast<char const*>(data);
                for (size_t i = 0; i < size; ++i)
                    m_Buffer.push_back(pc[i]);
            }
    
            std::vector<char> m_Buffer;
    };
    

Anmelden zum Antworten