如何让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
应该是他们的替代。
答案 0 :(得分:23)
如果不滚动自己的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创建接口 从元组的角度和数组的角度来看都是全面的 观点,如此缩小只是自然被禁止。查看更多详情 由设计决策中的这个方向驱动。
它还包含一个sample implementation,它相当长,所以复制在这里是不切实际的,但Konrad Rudolph有一个简化版here,它与上面的示例实现一致:
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)...};
}
答案 1 :(得分:11)
当你说“需要这么恐怖的复杂功能”时,你会有点过分了。您可以自己制作简化版本,该提案还包括一个“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)... }};
}