I think the following should work on floats without the exponential part (untested):
template<bool fp, long long num, long long denom, char ...> struct literal; template<bool fp, long long num, long long denom> struct literal<fp, num, denom> { static constexpr double value() { return (1.0*num)/denom; } }; template<long long num, long long denom, char digit, char... rest> struct literal<false, num, denom, digit, rest...> { static constexpr double value() { return literal<false, 10*num + (digit-'0'), denom, rest...>::value(); } }; template<long long num, long long denom, char digit, char... rest> struct literal<true, num, denom, digit, rest...> { static constexpr double value() { return literal<true, 10*num + (digit-'0'), 10*denom, rest...>::value(); } }; template<long long num, long long denom, char... rest> struct literal<false, num, denom, '.', rest...> { static constexpr double value() { return literal<true, num, denom, rest...>::value(); } }; template<char... c> double operator "" _dbl() { return literal<false, 0, 1, c...>::value(); }
How to extend this to also take the exponential part should be obvious.
Of course, you also need to do some error checking (make sure that the characters are really numbers).