OT Ceckarsky kviz
Miroslav Mraz
mrazik na volny.cz
Čtvrtek Leden 27 14:46:54 CET 2022
Zřejmě to závisí na překladači. V C++ jdou dělat i větší zvěrstva např.
#include <stdio.h>
#include <cmath>
// Compile: clang++ -std=c++14 -Oz
static constexpr double operator"" _deg (const long double arg) {
return arg * M_PI / 180.0;
}
// Velká písmena v názvu operátoru jsou vyhrazena ...
static constexpr unsigned long operator"" _h (const char * const str,
size_t n) {
unsigned long result = 0ul;
for (unsigned i=0u; i<n; i++) {
const char c = str [i] | '\x20'; // to lowercase
if ((c >= '0') and (c <= '9')) {
result *= 0x10ul;
result += c - '0';
} else if ((c >= 'a') and (c <= 'f')) {
result *= 0x10ul;
result += c - 'a' + 10;
} // ostatni znaky jako je '_' ignoruj
}
return result;
}
int main () {
// Tohle by mohlo mit nejaky smysl.
constexpr double args [] = { 30._deg, 45._deg, 60._deg, 0.5 * M_PI };
for (auto & arg : args) ::printf ("sin (%f) = %f\n", arg, std::sin(arg));
// Tohle uz je docela pitomost, gcc (a jine) s tim bude mit problem,
clang OK.
constexpr unsigned long n = "DEAD_beef_CAFE_babe"_h;
constexpr unsigned long m = 0xdEaDbEeFcAfEbAbE;
static_assert (m == n, "not equal"); // opravdu je to spocteno pri
prekladu
printf("0x%lX\n", "hello world"_h); // prevede se i nesmysl, ale proc ne
printf("%f\n", 0x1C2D.3EP4F); // projde i tahle hruza - 115411.875
return 0;
}
V řádce s poznámkou "to lowercase" je možná odpověď na otázku proč je to
někde case insensitive. Trochu to zkrátí kód parseru. Takže v C++ si
můžete napsat vlastní parser konstanty. Možná se to hodí na obfuskaci
kódu, ale prakticky bych se tomu vyhnul, čitelnost kódu je pak dost
bídná, obzvlášť když ty operátory definujete někde v hlavičce na 10.
úrovni zanoření.
Připadá mi, že je lépe psát deg_to_rad (30.) jako funkci (která může být
též constexpr) než operátor 30._deg. Sice se může zdát, že to takhle
můžete napsat i v C-čku, ale není tomu tak. Constexpr výrazy se
vyhodnotí při překladu, takže výsledný kód tím není zaplevelen. Dají se
s tím dělat různá kouzla https://kizarm.github.io/constexpr/index.html,
ale je to takové ... no divné.
Mrazík
Dne 27. 01. 22 v 14:19 Jan Waclawek napsal(a):
> ...
> A tiez pise, ze v C++ tie hexadecimal float konstanty nie su, ale to uz nie
> je pravda lebo to pribudlo v C++17.
>
> wek
>
Další informace o konferenci Hw-list