C++11: user defined literals

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
wanne
Moderator
Beiträge: 7548
Registriert: 24.05.2010 12:39:42

Re: C++11: user defined literals

Beitrag von wanne » 27.06.2014 09:11:06

schorsch_76 hat geschrieben:Das mit dem printf habe ich nur genutzt um beide Teile vergleichbar zu halten und nur auf das Feature zu gehen.
Nein. War es nicht. Ist aber egel.
schorsch_76 hat geschrieben:Ganz genau. Jetzt hast du es begriffen. Der ganze Aufwand war es, Typsicher den Compiler die Berechnung der Konstante machen zu lassen (constexpr) aber zur Laufzeit einfach einen double zu verarbeiten.
Meine Programme schmeisen aber typischerweise keine Statischen ergebnisse. Dazu fange ich normalerweise nicht an nen Compiler anzuwerfen. Soche Programme sind im Normalfall Sinnlos. Wenn ich die durchschnittsgeschwiniigkeit über eine Stunde ausrechen will schreibe ich garantiert keine 85 Zeilen Code. – Das ist Fehleranfällig.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
schorsch_76
Beiträge: 2601
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: C++11: user defined literals

Beitrag von schorsch_76 » 27.06.2014 11:09:54

Hier ist noch ein echtes nützliches Beispiel das nicht nur user defined literals zeigt, sondern type rich interface.

NoPaste-Eintrag37863

Damit kann ich, auch auf einem embedded Device, sicher stellen, dass ich immer richtig digits zu Spannung / Strom wandle. Im Kompilat rechne ich auch hier nur mit double. Der Compiler stellt sicher, dass ich ein "digit_from_dac2" nicht in eine Spannung wandle.

Benutzeravatar
schorsch_76
Beiträge: 2601
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: C++11: user defined literals

Beitrag von schorsch_76 » 27.06.2014 13:48:29

Oh ... noch ein Nachtrag:

NoPaste-Eintrag37864

Code: Alles auswählen

g++ -std=c++11 -O2 -s electric-conversion.cpp -o electric-conversion
georg@machariel ~/Dokumente/Entwicklung/c++11-snipets/type-rich-interface $ ls -la
insgesamt 20
drwxr-xr-x 2 georg users 4096 27. Jun 13:44 .
drwxr-xr-x 5 georg users 4096 27. Jun 13:00 ..
-rwxr-xr-x 1 georg users 6264 27. Jun 13:44 electric-conversion
-rw-r--r-- 1 georg users 3545 27. Jun 13:42 electric-conversion.cpp
georg@machariel ~/Dokumente/Entwicklung/c++11-snipets/type-rich-interface $ ldd electric-conversion
        linux-vdso.so.1 (0x00007fff25388000)
        libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.9.0/libstdc++.so.6 (0x00007fd2b3b61000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fd2b3867000)
        libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.9.0/libgcc_s.so.1 (0x00007fd2b3650000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fd2b32a0000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fd2b3e76000)
Auch die Version welche gegen die libstc++ linkt ist nicht groß.

Wenn ich versuche vom adc2 eine Spannung zu lesen, kommt

Code: Alles auswählen

 g++ -std=c++11 -O2 -s electric-conversion.cpp -o electric-conversion
electric-conversion.cpp: In Funktion »int main(int, char**)«:
electric-conversion.cpp:148:26: Fehler: Umwandlung von »{anonym}::digits_from_adc2« in nicht-skalaren Typen »uri::U {aka uri::Value<uri::Unit<1, 0> >}« angefordert
  U u3 = digits_from_adc2(); // error 
Das ist dann doch sehr deutlich.

Antworten