std::size (analog zu begin/end)
-
@krümelkacker
Ich wusste nicht dass das mit C++11 einfacher geht. Gut zu wissen, danke!
In C++03 ist es ... naja, seht selbst:
http://www.martinecker.com/wiki/index.php?title=Detecting_the_Existence_of_Member_Functions_at_Compile-TimeTrotzdem finde ich es etwas fragwürdig. Die C++03 Variante mit "more spezialized" Overloads die über ADL gefunden werden mag mehr Tipparbeit sein, da man für jede speziell zu behandelnde Klasse nen eigenen Overload braucht. Aber genau das ist auch irgendwo die Stärke dieser Variante: man weiss was man bekommt. Und muss nicht mit diversen Tricks rummachen, wenn die generische "one for all" Variante mal nicht das macht was man möchte.
-
Sone schrieb:
Sowas mag dir gefallen, aber in Production-Code hat das mMn. nix verloren.
Pardon? Production Code?
Ja.
Code der "produktiv" genutzt wird, aka. "production code".
Im Gegensatz zu Code der nicht "produktiv" genutzt wird, wie Code von Proof-of-Concept Implementierungen, Prototypen, irgendwelche kleinen Test-Tools, Zeugs was Leute privat zum Spass programmieren etc.
Wobei mit der Definition auch Ad-Hoc Lösungen, Build-Skripts etc. eingeschlossen wären - die sind aber normalerweise nicht gemeint wenn man "production code" sagt/schreibt.
Bzw. auch einfach: http://www.google.com/search?q="production+code"+programming
-
Marthog schrieb:
Aber warum sagen dann manche, man solle bei den Funktionen die globalen statt der Methoden verwenden, also
std::sort(std::begin(container), std::end(container));anstatt
std::sort(container.begin(), container.end());und begründen, dass man damit auch zu built-in Arrays konsistent wäre, man gleichzeitig aber keine Builtin-Arrays sondern std::array verwenden soll.
Wie von Nathan schon leicht angedeutet:
Nathan schrieb:
Edit: OK, man könnte inkompatible Container kompatibel machen, aber ich kenne keine Library mit Containern, die nicht eh schon mit der STL kompatibel ist.
Wenn du einen nicht STL kompatible Containern hast, aber jede Menge Funktionalität, die darauf angewiesen ist, dann stellst du einfach Überladung für begin() und end() zur Verfügung. Diese rufen dann von deinem Container die "begin" und "end" Funktion auf. Dann kannst du auch das hübsche range-based-for benutzen:
#include <iostream> using namespace std; struct Container { int a[2]; Container() : a{1,2} {} }; int* begin(Container &cont) { return cont.a; } int* end(Container &cont) { return cont.a+sizeof(cont.a)/sizeof(cont.a[0]); } int main() { Container conti; for(auto aa : conti) cout << aa << " "; }