如何在不直接提供大小的情况下创建带有初始化列表的 std::array
How to create std::array with initialization list without providing size directly
如何使a3
编译?
int main()
{
int a1[] = { 1, 2, 3 };
std::array<int, 3> a2 = { 1, 2, 3 };
std::array<int> a3 = { 1, 2, 3 };
}
使用初始化列表(尤其是长列表(时,对数组的大小进行硬编码非常不方便且脆弱。有什么解决方法吗?我希望如此,否则我会感到失望,因为我讨厌 C 数组,而std::array
应该是它们的替代品。
目前没有办法在不滚动自己的make_array
的情况下做到这一点,有一个关于这个 N3824 的建议: make_array其范围如下:
LWG 851 旨在提供替换语法
array<T, N> a = { E1, E2, ... };
,所以下面
auto a = make_array(42u, 3.14);
格式良好(内部应用了额外的static_casts(,因为
array<double, 2> = { 42u, 3.14 };
格式良好。
本文旨在提供一组 std::array 创建接口 从元组和数组的角度来看都是全面的 观点,所以缩小是自然被禁止的。查看更多详情 在设计决策中由这个方向驱动。
它还包括一个示例实现,该实现相当长,因此在此处复制是不切实际的,但 Konrad Rudolph 在这里有一个简化版本,与上面的示例实现一致:
template <typename... T>
constexpr auto make_array(T&&... values) ->
std::array<
typename std::decay<
typename std::common_type<T...>::type>::type,
sizeof...(T)> {
return std::array<
typename std::decay<
typename std::common_type<T...>::type>::type,
sizeof...(T)>{std::forward<T>(values)...};
}
当你说"需要如此复杂的(对我来说(函数"时,你有点过于戏剧化了。您可以自己制作简化版本,该提案还包括一个"to_array"函数来转换 C 数组并从第一个参数推断类型。如果你忽略它,它会变得非常容易管理。
template<typename T, typename... N>
auto my_make_array(N&&... args) -> std::array<T,sizeof...(args)>
{
return {std::forward<N>(args)...};
}
然后你可以像这样称呼
auto arr = my_make_array<int>(1,2,3,4,5);
编辑:我应该提到,在我忽略的提案中实际上有一个版本,所以这应该比我的版本更正确:
template <typename V, typename... T>
constexpr auto array_of(T&&... t)
-> std::array < V, sizeof...(T) >
{
return {{ std::forward<T>(t)... }};
}
相关文章:
- 是否可以在没有真实文件的情况下创建 ifstream
- 如何在不使用静态矩形方法的情况下创建 IDOMPathGeometryPtr?
- 在没有默认构造函数的情况下创建的派生对象
- 如何在没有侦听器的情况下创建 TCP 连接?
- 如何在不使用宽字符串的情况下创建目录C++?
- 是否可以在没有结构的情况下创建新的类型变量?
- 如何在不知道Arduino中知道其大小的情况下创建数组和存储值
- 如何在不使用虚拟的情况下创建装饰器函数
- 如何在给定任意数量的整数的情况下创建一个唯一键?并使用该键存储,然后从地图中查找
- 在不调用构造函数的情况下创建 Vector 元素
- 我们不能在不使用指向对象的指针的情况下创建节点C++吗?
- 在C++中,如何在没有新元素且不单独声明单个元素的情况下创建"std::initializer_list<base *>"?
- 为什么在这种情况下创建临时实例不起作用?
- 在不调用其构造函数的情况下创建对象
- 如何在不使用C 中使用新操作员的情况下创建对象
- GTKMM:如何在没有建造者的情况下创建弹出菜单
- 如何在 DPI 感知设置为DPI_AWARENESS_CONTEXT_UNAWARE的情况下创建进程
- 如何在不同步的情况下创建线程本地内存
- 如何在给定此定义的情况下创建类的实例
- 如何在不使用透明胶片的情况下创建Qt投影?(因为窗口管理器不支持)