gpt4 book ai didi

c++ - 将接受花括号初始化列表并推导长度的数组类

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:21 30 4
gpt4 key购买 nike

以前有人问过这个问题,但我很想知道在较新的 C++ 标准中是否有任何更改。任何当前或 future 的标准都是可以接受的。

:有没有办法创建一个 Array 类,它可以用 braced-init-list 初始化,而不必手动指定数组长度,元素存储在堆栈中,并且不不需要“make_array”函数。

template<class T, size_t N>
struct Array
{
T items[N];
};

Array<int> foo = { 1, 2, 3 };

由于 initializer_list 没有根据大小进行模板化,因此使用它的构造函数将无法完成这项工作。 C++17 中的推导指南几乎 有效,但您必须省略类型参数并且所有项目必须具有完全相同的类型

Array foo = { 1, 2, 3 }; // Works
Array<int> foo = { 1, 2, 3 }; // Doesn't work
Array foo = { 1.0, 2.0, 3.0f }; //Doesn't work

采用 c 数组的构造函数似乎不起作用,因为 initializer_list 不会转换为 c 数组。

braced-init-listT[N] 发生在 int foo[] = { 1, 2, 3 }; 无法在代码中复制的纯粹的编译器魔法?

编辑:这个问题的精神是关于上面的 exact 语法。没有 make_array,没有额外的模板参数,明确的项目类型,没有双括号,没有动态分配。如果一个普通的数组需要一堆现代 C++ tomfoolery 并且仍然无法支持标准语法,那么在我看来这只是一个糟糕的工程权衡。

最佳答案

您可以通过使用显式推导指南来解决列表中所有类型都相同的需求:

template <class... T>
Array(T&&... t) -> Array<std::common_type_t<T...>, sizeof...(T)>;

Array foo = { 1.0, 2.0, 3.0f }; // Deduces Array<double,3u>

关于c++ - 将接受花括号初始化列表并推导长度的数组类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53203629/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com