Я думаю, что следующее должно работать с плавающими без экспоненциальной части (не проверено):
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();
}
Как расширить это, чтобы принять экспоненциальную часть, должно быть очевидно.
Конечно, одинтакже хотел бы выполнить некоторую проверку ошибок (убедитесь, что символы действительно являются цифрами).