gpt4 book ai didi

c++ - 我可以使用 std::initializer_list 而不是大括号括起来的初始化程序来初始化数组吗?

转载 作者:IT老高 更新时间:2023-10-28 23:15:03 24 4
gpt4 key购买 nike

我可以使用 std::initializer_list 对象而不是大括号括起来的初始化程序来初始化数组吗?

众所周知,我们可以这样做:http://en.cppreference.com/w/cpp/language/aggregate_initialization

unsigned char b[5]{"abc"};
// equivalent to unsigned char b[5] = {'a', 'b', 'c', '\0', '\0'};

int ar[] = {1,2,3};
std::array<int, 3> std_ar2{ {1,2,3} }; // std::array is an aggregate
std::array<int, 3> std_ar1 = {1, 2, 3};

但我无法通过 std::initializer_list il; 初始化数组:

http://ideone.com/f6aflX

#include <iostream>
#include <initializer_list>
#include <array>

int main() {

int arr1[] = { 1, 2, 3 }; // OK
std::array<int, 3> arr2 = { 1, 2, 3 }; // OK

std::initializer_list<int> il = { 1, 2, 3 };
constexpr std::initializer_list<int> il_constexpr = { 1, 2, 3 };

//int arr3[] = il; // error
//int arr4[] = il_constexpr; // error

//std::array<int, 3> arr5 = il; // error
//std::array<int, 3> arr6 = il_constexpr; // error

return 0;
}

但是如何使用 std::initializer_list il; 来初始化一个数组呢?

最佳答案

其他回答正确的人说这是不可能的。但是有了小 helper ,您可以非常接近

template<typename T, std::size_T N, std::size_t ...Ns>
std::array<T, N> make_array_impl(
std::initializer_list<T> t,
std::index_sequence<Ns...>)
{
return std::array<T, N>{ *(t.begin() + Ns) ... };
}

template<typename T, std::size_t N>
std::array<T, N> make_array(std::initializer_list<T> t) {
if(N > t.size())
throw std::out_of_range("that's crazy!");
return make_array_impl<T, N>(t, std::make_index_sequence<N>());
}

如果您愿意接受更多解决方法,您可以将其放入一个类中,以便在您传递一个花括号初始化列表的情况下捕获静态已知的长度违规。但请注意,大多数阅读此代码的人都会在前台工作

template<typename T, std::size_t N>
struct ArrayInitializer {
template<typename U> struct id { using type = U; };
std::array<T, N> t;

template<typename U = std::initializer_list<T>>
ArrayInitializer(typename id<U>::type z)
:ArrayInitializer(z, std::make_index_sequence<N>())
{
if(N > z.size())
throw std::out_of_range("that's crazy!");
}

template<typename ...U>
ArrayInitializer(U &&... u)
:t{ std::forward<U>(u)... }
{ }

private:
template<std::size_t ...Ns>
ArrayInitializer(std::initializer_list<T>& t,
std::index_sequence<Ns...>)
:t{ *(t.begin() + Ns) ... }
{ }
};

template<typename T, std::size_t N>
std::array<T, N> f(ArrayInitializer<T, N> ai) {
return std::move(ai.t);
}

int main() {
f<int, 5>({1, 2, 3, 4, 5}); // OK
f<int, 5>({1, 2, 3, 4, 5, 6}); // "too many initializers for array<int, 5>"

std::initializer_list<int> il{1, 2, 3, 4, 5};
f<int, 5>(il); // ok
}

请注意,答案顶部的非静态案例和“head-desk”案例仅检查您是否为 initializer_list 提供了太少的初始化元素,然后出现错误> 案例。如果您为 initializer_list 情况提供了太多,则将忽略尾随元素。

关于c++ - 我可以使用 std::initializer_list 而不是大括号括起来的初始化程序来初始化数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38932089/

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