"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Modernes C++

SaxoVtsMike 16.05.2020 - 12:00 4215 6
Posts

Vinci

hatin' on summer
Registered: Jan 2003
Location: Wien
Posts: 5774
Zitat aus einem Post von that
C++-Code kann auch ziemlich kompakt sein, wobei zugegebenermaßen die Syntax noch immer manchmal etwas umständlich ist.

Da 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: CPP
  auto 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. :p

Paxi

Overclocking Team Member
Avatar
Registered: Oct 2009
Location: Wien
Posts: 384
Obwohl ich mittlerweile schon paar Jahre C++ entwickle, den Code muss ich erst verdauen :D

Zitat aus einem Post von Vinci
Da 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: CPP
  auto 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. :p

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
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 :D
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) })

Das Resultat der Operation ist eine Map<String, CrFileReference>.
Bearbeitet von Obermotz am 17.06.2020, 13:16

Paxi

Overclocking Team Member
Avatar
Registered: Oct 2009
Location: Wien
Posts: 384
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

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
Zwecks Vorteile: Schau dir mal den Code an und überleg wie viele Schleifen du schreiben müsstest um das gleiche Ergebnis zu erreichen..

Vinci

hatin' on summer
Registered: Jan 2003
Location: Wien
Posts: 5774
Zitat aus einem Post von Paxi
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

Im Prinzip geht mit Ranges nichts was mit Iteratoren nicht auch schon ging. Der größte Vorteil ist dass der Code einfach sehr kompakt wird.
Außerdem sind Ranges by Default lazy.

that

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11326
Ich freu mich schon auf Ranges. Endlich Schluss mit "DoSomething(meinSuperTollerContainer.begin(), meinSuperTollerContainer.end())".
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz