Code-Duplizierung vermeiden für const- und nonconst- Accessor



  • Ich bin zZt dabei, eine Implementierung von std::vector zu schreiben (ursprünglich angefangen um eine Iteratorklasse für einen meiner Artikel zu testen). Dabei bin ich darüber gestolpert, dass diverse Zugriffsmethoden jeweils eine const und nonconst-Methode haben.
    Beispiel:

    template <class T>
    class vector
    {
    private:
      T* data;
      typedef T* pointer;
      typedef T const* const_pointer;
      //etc.
    
      pointer ptrbegin() {return data;}
      const_pointer ptrbegin() const {return data;}
      pointer ptrend() {return ptrbegin() + size();}                          // + const
    public:
      iterator begin() {return ptrbegin(); /*automatische konvertierung*/}    // + const
      iterator end() {return ptrend(); /*automatische konvertierung*/}        // + const
      /** weitere:
       * rbegin()
       * rend()
       * operator[]()
       * at()
       **/
    };
    

    All diese Methoden haben bis auf ein const_ vorne am Rückgabetyp und den const-specifier für die Methode die selbe Signatur und die selbe Implementierung für die const- und nonconst-Version.

    Das selbe Problem wird hier auch angesprochen: http://www.c-plusplus.net/forum/viewtopic-var-t-is-241290.html
    Sieht jemand ne Lösung wie das zu meisten ist? (durch das const_ am Rückgabetyp wird wohl nur ein Makro in Frage kommen)



  • willst du

    const iterator begin() const;
    

    oder

    const_iterator begin() const;
    

    ?



  • Wie man aus dem ersten Beispiel mit pointer und const_pointer, der Spezifikation von std::vector und meinem Kommentar bezüglich "wegen const_ müsste es wohl ein Makro sein" und der Tatsache, dass ein const_iterator was völlig anderes als ein const iterator ist, entnehmen kann, zweiteres.



  • Ich denke die beste Lösung ist dieses Problem nicht zu lösen, und die const Overloads einfach nochmal extra hinzuschreiben.


Anmelden zum Antworten