Как распаковать const char * str в шаблон? - PullRequest
0 голосов
/ 15 декабря 2018

Мотивация:

Ниже приведена реализация преобразования 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 ... преобразование

...