Modernes C++
SaxoVtsMike 16.05.2020 - 12:00 4543 6
Vinci
hatin' on summer
|
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. 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.
|
Paxi
Overclocking Team Member
|
Obwohl ich mittlerweile schon paar Jahre C++ entwickle, den Code muss ich erst verdauen 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.
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.
|
Obermotz
Fünfzylindernazi
|
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): @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
|
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
|
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
|
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
ModeratorHoffnungsloser Optimist
|
Ich freu mich schon auf Ranges. Endlich Schluss mit "DoSomething(meinSuperTollerContainer.begin(), meinSuperTollerContainer.end())".
|