Template- und Funktions- defaultparameter
-
Wieso ist sowas nicht möglich (Memberfunktion):
template <typename Predicate = std::less<T>> void my_super_magic_constant_time_sort(Predicate pred = Predicate()) { }Übersehe ich hier etwas, oder ist das ein Fehler meines Compilers?
-
Hat dein Compiler C++0x drauf? Und da es sich um eine Methode handelt, solltest du vor dem Funktionsnamen noch die Klasse, die sie beinhaltet und einen Bereichauflösungsoperator schreiben.
EDIT: Funktionstemplates können keine Default-Argumente haben
-
Die Methode wird hier nur als Beispiel direkt innerhalb der Klasse definiert. Ja ich verwende C++0x, aber ich wüsste nicht, welchen Unterschied das machen sollte.
Dieses Problem hatte ich vor einiger Zeit und ich habe mich darüber gewundert. Vielleicht funktioniert das jetzt ja, aber damals hat das im GCC nicht funktioniert.
-
Funktionstemplates können (seltsamerweise) keine Default-Argumente haben.
-
Nein, Quatsch! Sorry...
-
(1) Was ist T?
(2) Funktionstemplates können keine Default-Template-Argumente haben.
-
T ist in dem Fall der template-Parameter eine std::list Implementierung.
Gibt es für (2) einen Grund?
-
314159265358979 schrieb:
Gibt es für (2) einen Grund?
Keinen (mir bekannten) technischen.
Ich vermute dass es einfach übersehen wurde, oder als "nicht nützlich genug => den Aufwand nicht wert" weggelassen.
-
Nunja, ich musste das Problem durch eine Überladung lösen, sehr nervig.
Wie ist das eigentlich, sollte man beim sortieren für "default"-Sortierung std::less<T> oder operator < nehmen?
-
Ich würde std::less nehmen.
Ich wüsste auch nicht wie man
operator <ohne Umstände (=zusätzliche Hilfsklassen/-funtionen) verwenden könnte, ohne die Flexibilität einzuschränken.
-
Du könntest natürlich auch ein function-like Klassentemplate machen. Den less-Operator kann man zwar auch verwenden, aber niemand weiss, ob er frei ist oder als Methode implementiert wurde.
-
EOutOfResources schrieb:
Den less-Operator kann man zwar auch verwenden, aber niemand weiss, ob er frei ist oder als Methode implementiert wurde.
std::lessist ein Funktor, der aufoperator<zurückgreift. Wenns ihn schon gibt, würde ich ihn auch verwenden. Er garantiert im Gegensatz zuoperator<auch definiertes Strict Weak Ordering bei Zeigervergleichen.