如何使用字符串文字初始化std :: array <char,n =“”>,省略尾部'\ 0'

时间:2015-11-02 18:16:27

标签: c++ arrays c++11

我有一个文件结构,其中固定长度的字符串没有尾随零。 如何将字段初始化为std :: array而不是尾随零:

#pragma pack(push, 1)
struct Data {
    // Compiles, but it has an undesired '\0':
    std::array<char, 6> undesired_number{"12345"};
    // Does not compile:
    std::array<char, 5> number{"12345"}; // stripping '\0'
};
#pragma pack(pop)

2 个答案:

答案 0 :(得分:15)

制作辅助功能

template <std::size_t N, std::size_t ... Is>
constexpr std::array<char, N - 1>
to_array(const char (&a)[N], std::index_sequence<Is...>)
{
    return {{a[Is]...}};
}

template <std::size_t N>
constexpr std::array<char, N - 1> to_array(const char (&a)[N])
{
    return to_array(a, std::make_index_sequence<N - 1>());
}

然后

struct Data {
    std::array<char, 5> number{to_array("12345")}; // stripping '\0'
};

Demo

答案 1 :(得分:0)

字符串文字 NUL终止,在C ++中(与C不同)你不能通过提供Length - 1大小来取消它;因此,直接无法完成,同时也认为array内部是T[N]