URL: https://www.overclockers.at/coding-stuff/modernes-c_255927/page_1 - zur Vollversion wechseln!
Zitat aus einem Post von thatC++-Code kann auch ziemlich kompakt sein, wobei zugegebenermaßen die Syntax noch immer manchmal etwas umständlich ist.
Code: CPPauto ivs{ranges::istream_view<char>{is} | views::take_while([](auto c) { return c != ':'; }) | views::split(';') | views::drop_exactly(1u) | views::for_each([](auto&& r) { return r | views::split('\t') | views::drop_exactly(8u); }) | views::transform([](auto&& r) { std::string tmp; ranges::for_each(r, [&tmp](auto c) { tmp += c; }); return std::stoull(tmp); })};
Obwohl ich mittlerweile schon paar Jahre C++ entwickle, den Code muss ich erst verdauen
Zitat aus einem Post von VinciDa hab ich doch glatt ein schönes Beispiel heut. 10 Zeilen C++20 mit Ranges lesen aus einem firmeninternen proprietären Format Initialisierungsvektoren für einen Salsa20 Stream Cipher aus.Code: CPPauto ivs{ranges::istream_view<char>{is} | views::take_while([](auto c) { return c != ':'; }) | views::split(';') | views::drop_exactly(1u) | views::for_each([](auto&& r) { return r | views::split('\t') | views::drop_exactly(8u); }) | views::transform([](auto&& r) { std::string tmp; ranges::for_each(r, [&tmp](auto c) { tmp += c; }); return std::stoull(tmp); })};
Der Umweg über den temporären String ist natürlich noch Käse... aber ziemlich beeindruckend was mit Ranges so geht. Da können sich unsere C-Entwickler noch so deppate Binärformate einfallen lassen.
Ja sicher, C++ ist auch deutlich kompakter geworden.
Aber während man hier mittlerweile verschiedenste Operationen auf ranges machen kann, können das andere Programmiersprachen schon lange und der bedeutende Unterschied - es ist sogar sehr gut lesbar
Ein beliebiges Beispiel aus meinem aktuellen Projekt (Kotlin):
Code:@Transactional(readOnly = true) override fun getReferencesByIds(ids: Collection<String>) = crFileRepository .getByUuidIn(ids) .partition { it.uuid in ids } .also { (_, notFound) -> if (notFound.isNotEmpty()) throw EntityNotFoundException("could not find files: ${notFound.joinToString()}}") } .first .associateBy(keySelector = CrFile::uuid, valueTransform = { CrFileReference(it.id) })
Beruflich gearbeitet habe ich bisher vorrangig mit C++ und JAVA. Nebenher noch bisschen was mit C, PHP und Python. In Summe sinds jz ca 7 Jahre C++ wenn ich meinen Teilzeitjob im Studium dazurechne.
Für mich ist C++ immer noch die Sprache der Wahl. Vieles ist oft auf den ersten Blick komplexer aber das macht für mich auch etwas den Reiz aus sich dann damit auseinander zusetzten. Mit ranges hab ich bisher noch nie gearbeitet. Aber allein schon die ganze move semantics Thematik, die oben auch eine gewisse Rolle spielt, hat mich damals schon in C++11 fasziniert. Kann ich "Effective Modern C++" übrigens sehr empfehlen.
Was wären eig für euch die großen Vorteile von Ranges bzw was könnte man damit tun, was man sonst nicht oder nur über Umwege tun kann? Hab mich damit noch nie beschäftigt und bisher hätte ich eig noch alles mit iteratoren lösen können
Zwecks Vorteile: Schau dir mal den Code an und überleg wie viele Schleifen du schreiben müsstest um das gleiche Ergebnis zu erreichen..
Zitat aus einem Post von PaxiWas wären eig für euch die großen Vorteile von Ranges bzw was könnte man damit tun, was man sonst nicht oder nur über Umwege tun kann? Hab mich damit noch nie beschäftigt und bisher hätte ich eig noch alles mit iteratoren lösen können
Ich freu mich schon auf Ranges. Endlich Schluss mit "DoSomething(meinSuperTollerContainer.begin(), meinSuperTollerContainer.end())".
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025