How to initialize a std::array with a string literal omitting the trailing '\0'

后端 未结 2 1809
暖寄归人
暖寄归人 2020-12-16 03:01

I have a file structure where fixed length strings have no trailing zero. How to initialize fields as std::array without trailing zero:

#pragma pack(push, 1)         


        
相关标签:
2条回答
  • 2020-12-16 03:44

    A string literal is NUL-terminated, in C++ (unlike C) you cannot take it off by providing a Length - 1 size; therefore it cannot be done directly, also considering that array internally is a T[N].

    0 讨论(0)
  • 2020-12-16 03:45

    Making a helper function

    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>());
    }
    

    And then

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

    Demo

    0 讨论(0)
提交回复
热议问题