如何使用初始化列表创建std :: array而不直接提供大小

Nei*_*irk 39 c++ initialization stdarray

我怎样才能a3编译?

int main()
{
    int a1[] = { 1, 2, 3 };
    std::array<int, 3> a2 = { 1, 2, 3 };
    std::array<int> a3 = { 1, 2, 3 };
}
Run Code Online (Sandbox Code Playgroud)

使用初始化列表时,对数组的大小进行硬编码是非常不方便的,也是很脆弱的,特别是长的列表.有什么工作吗?我希望如此,否则我很失望,因为我讨厌C阵列,std::array应该是他们的替代品.

Sha*_*our 24

目前没有办法在没有滚动自己的情况下做这个make_array,有一个建议为这个N3824:make_array具有以下范围:

LWG 851旨在提供替代语法

array<T, N> a = { E1, E2, ... };
Run Code Online (Sandbox Code Playgroud)

,以下

auto a = make_array(42u, 3.14);
Run Code Online (Sandbox Code Playgroud)

格式正确(内部应用了额外的static_casts)因为

array<double, 2> = { 42u, 3.14 };
Run Code Online (Sandbox Code Playgroud)

结构良好.

本文打算提供一组std :: array创建接口,这些接口从元组的角度和数组的角度来看都是全面的,所以缩小只是自然被禁止.在Design Decisions中查看由此方向驱动的更多详细信息.

它还包括一个样本实现,这个实现相当长,因此复制到这里是不切实际的,但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)...};
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*erT 12

当你说"需要这么复杂的(对我而言)功能时,你会有点过分".您可以自己制作简化版本,该提案还包括一个"to_array"函数,用于转换C数组并从第一个参数中推导出类型.如果你把它留下来就变得非常易于管理.

template<typename T, typename... N>
auto my_make_array(N&&... args) -> std::array<T,sizeof...(args)>
{
    return {std::forward<N>(args)...};
}
Run Code Online (Sandbox Code Playgroud)

然后你可以打电话给

auto arr = my_make_array<int>(1,2,3,4,5);
Run Code Online (Sandbox Code Playgroud)

编辑:我应该提一下,我忽略了提案中的实际版本,所以这应该比我的版本更正确:

template <typename V, typename... T>
constexpr auto array_of(T&&... t)
    -> std::array < V, sizeof...(T) >
{
    return {{ std::forward<T>(t)... }};
}
Run Code Online (Sandbox Code Playgroud)

  • 要添加到这些注释(尽管很晚),双括号与std :: array初始化有关.[这里描述.](/sf/answers/821453181/)我认为`{std :: forward <N>(args)...};`工作的原因是轻微的放松大括号的规则,[此处描述](http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3526.html). (2认同)