首页 > 后端开发 > C++ > 如何在 C 中使用 `std::array` 模拟 C 风格的数组初始化?

如何在 C 中使用 `std::array` 模拟 C 风格的数组初始化?

Barbara Streisand
发布: 2024-12-17 20:23:14
原创
603 人浏览过

How Can I Mimic C-Style Array Initialization with `std::array` in C  ?

使用 std::array 模拟 C 数组初始化

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板