Мотивация:
Ниже приведена реализация преобразования base-n в десятичное число:
template<int from, char... Chs>
constexpr int
toDec()
{
int ret{};
return (
(ret *= from, ret += Chs > '9' ? Chs - 'A' + 10 : Chs - '0'), ...);
}
inline namespace literals
{
template<char... Chs>
constexpr int operator"" _B()
{
return toDec<2, Chs...>();
}
template<char... Chs>
constexpr int operator"" _O()
{
return toDec<8, Chs...>();
}
} // namespace literals
Отлично работает с base-2
и base-8
:
static_assert(111_B == 7);
static_assert(011_B == 3);
static_assert(052 == 52_O);
static_assert(073227 == 73227_O);
Но для base-16, потому что у нас есть не числовые символы, поэтому числа вроде E7_X
не будут работать (error: use of undeclared identifier 'E7_X'
), поэтому я использую user-defined-string-literal
:
constexpr int operator""_X(const char* str, unsigned long)
{
// do something to unpack str into <char...>, so I can reuse toDec;
}
......
static_assert(0XE7 == "E7"_X);
Длясухой, я надеюсь повторно использовать toDec
, поэтому мне нужно распаковать str
в <char...>
, у вас есть идеи?(Если у вас есть какое-нибудь элегантное решение для случая base-16, скажите, пожалуйста, я был бы очень признателен!)
, а в C ++ 14 двоичные литералы также являются стандартными
Да, я в курсе.Вот только практика и, по некоторым причинам, я надеюсь получить base-11/12/13/14 ... преобразование