Ich unterrichte seit vielen Jahren einen C++-Programmierkurs, und eines der schwierigsten Dinge, die man den Studenten erklären muss, ist das Überladen von Konstanten. Ich verwende häufig das Beispiel einer vektorartigen Klasse und ihrer operator[]
Funktion:
template <typename T> class Vector {
public:
T& operator[] (size_t index);
const T& operator[] (size_t index) const;
};
Ich habe wenig bis keine Schwierigkeiten zu erklären, warum zwei Versionen der operator[]
Funktion benötigt werden, aber bei dem Versuch, zu erklären, wie man die beiden Implementierungen zusammenführt, verliere ich oft viel Zeit mit Sprach-Arkanen. Das Problem ist, dass die einzige gute und zuverlässige Methode, die ich kenne, um eine dieser Funktionen in Bezug auf die andere zu implementieren, die const_cast
/ static_cast
Trick:
template <typename T> const T& Vector<T>::operator[] (size_t index) const {
/* ... your implementation here ... */
}
template <typename T> T& Vector<T>::operator[] (size_t index) {
return const_cast<T&>(static_cast<const Vector&>(*this)[index]);
}
Das Problem bei dieser Vorgehensweise ist, dass sie äußerst kompliziert zu erklären und keineswegs intuitiv einleuchtend ist. Wenn man es als "cast to const, dann call the const version, dann strip off constness" erklärt, ist es ein wenig leichter zu verstehen, aber die eigentliche Syntax ist erschreckend,. Erläutern, was const_cast
ist, warum er hier angebracht ist und warum er anderswo fast durchgängig unangebracht ist, kostet mich normalerweise fünf bis zehn Minuten Vortragszeit, und der Sinn dieses ganzen Ausdrucks zu verstehen, erfordert oft mehr Mühe als der Unterschied zwischen const T*
y T* const
. Ich bin der Meinung, dass die Studierenden wissen müssen, was const-overloading ist und wie man es macht, ohne den Code in den beiden Funktionen unnötig zu duplizieren, aber dieser Trick scheint in einem Einführungskurs in die C++-Programmierung etwas übertrieben.
Meine Frage lautet: Gibt es einen einfacheren Weg zur Umsetzung const
-überlasteten Funktionen im Verhältnis zueinander? Oder gibt es eine einfachere Möglichkeit, den Schülern diesen bestehenden Trick zu erklären?