knivil schrieb:
Nein, * und < koennen als Operatoren der Klasse implementiert sein und erhalten somit Semantik, aber fuer 0 und 1 bzw. -1 gibt es keinen schoenen allgemeinen Weg. Einfachstes Beispiel ist das Template max. Dort wuerde meine Argumentation fehlschlagen.
Das liegt aber hauptsächlich an deinem schlechten Funktionstemplate. Wenn man es nämlich ein wenig umschreibt, dann fallen so gut wie alle deine Punkte weg:
template<typename T>
T abs(T const& val)
{
return (val < T() ? -val : val);
}
Zudem, wie es bei allen Templates der Fall ist, wie auch bei allen Algorithmen aus der Standardbibliothek, muss der Typ T halt einem gewissen Konzept folgen. Aber mit der oben genannten Vorgehensweise dürfte man viele Möglichkeiten, abdecken. Man hat auch keine 0 und keine -1 mehr.
Für spezielle Typen, wie zum Beispiel einen Vektor, darf man eine Spezialisierung anbieten. Der Standard erlaubt ja nur, dass man Funktionen aus dem Namensraum std spezialisieren darf, aber nichts in diesem Namensraum dazufügen.
Wobei man hier schlussendlich dann wohl auf das gleiche Problem wie mit std::swap stossen wird. Wodurch eine Überladung, bei welcher man auf ADL setzt, trotzdem benötigt wird. Aber immerhin nur bei gewissen Typen.
Durch den einheitlichen Funktionsnamen hat man zudem einen standardisierten Funktionsnamen. Wodurch alle Funktionen hoffentlich so heissen werden. Weil in C die Überladung fehlt, fehlt dieser einheitliche Namen aktuell vollkommen.
Obwohl so ein Funktionstemplate auch ein paar Nachteile hat, sehe ich im allgemeinen allerdings mehr Vorteile gegenüber den aktuellen Möglichkeiten.
Grüssli