I've been looking into some of the new features of C++11 and am very impressed with some of them, particularly the user defined literals.
These allow you to define literals of the form 999_something
where something
controls what is done to the 999
to generate the literal. So no more having to use:
#define MEG * 1024 * 1024
int ten_meg = 10 M;
I was thinking this would be nice to implement underscores in large numbers, like 1_000_000_blah
which would match the readability of Perl, though the idea that Perl is somehow readable seems quite humorous to me :-)
It would also be handy for binary values like 1101_1110_b
and 0011_0011_1100_1111_b
.
Obviously because of the _
characters, these will need to be raw mode type, processing a C string, and I'm okay with that.
What I can't figure out is how to deliver a different type based on the operand size. For example:
1101_1110_b
should give a char
(assuming char
is 8-bit of course) while:
0011_0011_1100_1111_b
would deliver a 16-bit type.
I can get the length of the operand from within the literal operator function operator""
itself (by counting digit chars) but the return type seems to be fixed to the function so I can't return a different type based on this.
Can this be done with a single suffix _b
within the user defined types framework, or do I need to resort to splitting the types apart manually (_b8
, _b16
and so on) and provide mostly duplicate functions?