2015-11-02 46 views
5

我有一个文件结构,其中固定长度的字符串没有尾随零。 如何初始化字段的std ::阵列而不尾随零:如何初始化std ::数组<char, N>与字符串文字省略结尾' 0'

#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) 
+0

什么是编译器错误?不兼容的类型?恐怕根据字符串文字是不可能的。 –

+3

为什么你必须使用字符串文字来初始化它? – Barmar

+0

@Barmar只是为了方便 –

回答

11

制作辅助函数

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

template <std::size_t N> 
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

+0

我不知道这是否会编译成一个字面的副本,或两个,终止符和一个没有。 – luk32

+0

@ luk32取决于编译器和优化设置。例如,带O3的g ++根本没有文字。 – SergeyA

+0

在获得'make_index_sequence'并更改为'std :: array number = to_array(“12345”)后,与C++ 11很好地协作。 ' –

0

字符串文字 NUL结束,在C++(不像C)你不能把它关闭通过提供Length - 1大小;因此不能直接,也考虑array内部是T[N]

+0

该标准不要求'array'内部是'T [N]'。有人认为它应该,无论如何'N> 0' –