在 C 编程中,可以使用语法 int arr[] = { e1, e2, e3 来简化数组初始化, ... },其中元素的数量是自动推断的。虽然 std::array 提供了 C 数组的现代替代方案,但它缺乏这种方便的初始化方法。本文探讨了使用 std::array 模拟此行为的技术。
一种方法涉及可变参数模板函数:
template<class T, class... Tail> auto make_array(T head, Tail... tail) -> std::array<T, 1 + sizeof...(Tail)> { std::array<T, 1 + sizeof...(Tail)> a = { head, tail ... }; return a; }
此函数采用初始元素头和任意数量的附加元素作为尾巴。它创建一个适当大小的 std::array,并使用提供的元素对其进行初始化。例如,代码 auto a = make_array(1, 2, 3);初始化一个包含元素 1、2 和 3 的 std::array。
但是,这种方法面临局限性。它依赖于编译器优化返回值副本的能力,这可能并不总是可靠的。此外,它无法初始化嵌套类型,这是 C 数组初始化支持的功能。要克服这些限制,请考虑以下改进:
#define ARRAY(...) make_array(__VA_ARGS__)
template<class T, class... Tail> auto make_array(std::array<T, Size> head, Tail... tail) -> std::array<T, Size + sizeof...(Tail)> { std::array<T, Size + sizeof...(Tail)> a = { head, tail ... }; return a; }
使用这些改进,嵌套类型初始化成为可能,如示例所示:
#define ARRAY(...) make_array(__VA_ARGS__) struct A { int a; int b; }; auto arr = ARRAY(A{1, 2}, A{3, 4});
这些技术提供了一个强大的解决方案,用于使用 std::array 模拟 C 数组初始化,从而可以在现代 C 代码中方便、简洁地初始化 std::array 对象。
以上是如何在 C 中使用 `std::array` 模拟 C 风格的数组初始化?的详细内容。更多信息请关注PHP中文网其他相关文章!