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.