我怎样才能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
应该是它们的替代品。
我怎样才能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)... }};
}