无需指定长度初始化C++ std::array:如何从初始化列表推导长度?
当然可以!用C++17的类模板参数推导就能解决这个问题
你吐槽的这个重复指定数组大小的问题确实很烦人,完全违反DRY原则——好在从C++17开始,标准库引入了类模板参数推导(CTAD,Class Template Argument Deduction),专门解决这类需要手动重复模板参数的场景,std::array也完美支持这个特性。
具体怎么写?
在C++17及以后的版本里,你有两种简洁的写法可选:
- 完全让编译器推导所有参数:
// 编译器会自动推导元素类型为int,数组大小为3 std::array my_array {1, 5, 3}; - 显式指定元素类型,让编译器推导大小:
// 你指定元素类型为int,编译器自动算出初始化列表的长度是3 std::array<int> my_array {1, 5, 3};
这两种写法都能达到你想要的效果:不用手动写数组长度,完全从初始化列表里自动推导,彻底避免重复。
注意事项
- 如果初始化列表里的元素类型不一致,编译器会自动推导它们的共同类型。比如
std::array my_array {1, 2.5, 3};会把元素类型推导为double。 - 如果你需要强制元素为某个特定类型(比如避免隐式转换),显式指定第一个模板参数就好,比如
std::array<float> my_array {1, 2, 3};,元素会被转换成float类型。
旧版本C++的变通方案
如果你还在使用C11或C14(没有CTAD支持),可以自己实现一个make_array模板函数来绕开这个问题:
template<typename T, typename... Args> constexpr std::array<T, sizeof...(Args)> make_array(Args&&... args) { return {std::forward<Args>(args)...}; } // 使用方式:指定元素类型,自动推导大小 auto my_array = make_array<int>(1, 5, 3);
这个函数会根据传入的参数数量自动计算数组大小,同样能避免手动重复写数字。不过当然,这不如C++17的原生CTAD简洁直观。
内容的提问来源于stack exchange,提问作者schorsch312
相关产品推荐
相关产品推荐

