This question is being asked because of this one.
C++11 allows you to define literals like this for numeric literals:
template<char...> OutputType operator "" _suffix();
Which means that 503_suffix would become <'5','0','3'>
This is nice, although it isn’t very useful in the form it’s in.
How can I transform this back into a numeric type? This would turn <'5','0','3'> into a constexpr 503. Additionally, it must also work on floating point literals. <'5','.','3> would turn into int 5 or float 5.3
A partial solution was found in the previous question, but it doesn’t work on non-integers:
template <typename t>
constexpr t pow(t base, int exp) {
return (exp > 0) ? base * pow(base, exp-1) : 1;
};
template <char...> struct literal;
template <> struct literal<> {
static const unsigned int to_int = 0;
};
template <char c, char ...cv> struct literal<c, cv...> {
static const unsigned int to_int = (c - '0') * pow(10, sizeof...(cv)) + literal<cv...>::to_int;
};
// use: literal<...>::to_int
// literal<'1','.','5'>::to_int doesn't work
// literal<'1','.','5'>::to_float not implemented
I think the following should work on floats without exponential part (untested):
How to extend this to also take an exponential part should be obvious.
Of course one would also want to do some error checking (make sure that the characters are indeed digits).