如何从constexpr char *构建更大的std :: array

时间:2019-05-23 15:16:57

标签: c++ c++17 constexpr

如何从较小的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。 for循环会起作用,这很愚蠢...?

1 个答案:

答案 0 :(得分:3)

您无法从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);
}