Как построить больший std :: array из constexpr char * - PullRequest
2 голосов
/ 23 мая 2019

Как я могу построить std::array<char,512> из меньшего constexpr const char*?

#include <array>

strcut A{
    template<std::size_t N>
    constexpr A(const char (&p)[N]) : a(p) {}
    std::array<char, 512> a;
}

int main()
{
    constexpr const char* s = "asdasd";
    constexpr A a(s);
}

Выше не компилируется.Возможно ли это как-то?std::memcpy не работает, так как не является constexpr.А цикл будет работать, что глупо ...?

1 Ответ

3 голосов
/ 23 мая 2019

Вы не можете сделать это с constexpr const char*, так как это теряет информацию о размере. Но вы можете от constexpr char[], что у вас есть от литерала, и это достаточно просто:

#include <array>
#include <utility>

template<size_t N, size_t I, size_t... Ix>
constexpr auto make_array(const char (&arr)[N], std::index_sequence<Ix...>) {
    return std::array<char, I>{arr[Ix]...};
}

struct A{
    template<std::size_t N>
    constexpr A(const char (&p)[N]) :
          a(make_array<N, 512>(p, std::make_index_sequence<N>{})) {}

    std::array<char, 512> a;
};

int main()
{
    constexpr decltype(auto) s = "asdasd";
    constexpr A a(s);
}
...