C++ 已存在std::array中的std::initializer列表,而不枚举每个元素

C++ 已存在std::array中的std::initializer列表,而不枚举每个元素,c++,arrays,initializer-list,C++,Arrays,Initializer List,假设我有一个具有以下构造函数的类: class Foo { Foo(std::initializer_list<uin8_t> args) { .... } } 这种方式似乎有点复杂,而且感觉不应该这样 那么,我可以从已经存在的数组中创建一个std::initializer列表,而不枚举每个数组元素吗?不,您不能这样做。这个API只接受一个初始值设定项列表,并且没有能力接受,比如说,一对迭代器,或者一个指针加上一个大小,这是有缺陷的。在野外,你几乎

假设我有一个具有以下构造函数的类:

class Foo {
    Foo(std::initializer_list<uin8_t> args)
    {
     ....
    }
}
这种方式似乎有点复杂,而且感觉不应该这样


那么,我可以从已经存在的数组中创建一个std::initializer列表,而不枚举每个数组元素吗?

不,您不能这样做。这个API只接受一个初始值设定项列表,并且没有能力接受,比如说,一对迭代器,或者一个指针加上一个大小,这是有缺陷的。在野外,你几乎看不到这样的API。

不,你做不到。这个API只接受一个初始值设定项列表,并且没有能力接受,比如说,一对迭代器,或者一个指针加上一个大小,这是有缺陷的。实际上,在野外你永远不会看到这样的API。

因为你不能修改Foo,你可以创建自己的make\u Foo方法来自动扩展数组:

struct Foo
{
    Foo(std::initializer_list<int> args) {}
};

template <std::size_t N, std::size_t... Is>
auto make_foo(std::array<int, N>& arr, std::index_sequence<Is...>) -> Foo
{
  return Foo{arr[Is]...};
}


template <std::size_t N>
auto make_foo(std::array<int, N>& arr) -> Foo
{
  return make_foo(arr, std::make_index_sequence<N>{});
}

auto test()
{
  std::array<int, 4> arr = {{1, 2, 3, 4}};

  auto foo = make_foo(arr);
}

由于无法修改Foo,因此可以创建自己的make\u Foo方法来自动扩展数组:

struct Foo
{
    Foo(std::initializer_list<int> args) {}
};

template <std::size_t N, std::size_t... Is>
auto make_foo(std::array<int, N>& arr, std::index_sequence<Is...>) -> Foo
{
  return Foo{arr[Is]...};
}


template <std::size_t N>
auto make_foo(std::array<int, N>& arr) -> Foo
{
  return make_foo(arr, std::make_index_sequence<N>{});
}

auto test()
{
  std::array<int, 4> arr = {{1, 2, 3, 4}};

  auto foo = make_foo(arr);
}

为什么不向接受std::array的构造函数集添加一个重载呢?不,这是不可能的。实际上,您只能显式创建一个空的,因为没有向其中添加元素的功能。@NathanOliver这只是因为Foo类来自其他API,所以我想知道是否可以更有效地使用此构造函数。至于另一种可能的解决方案,而是为std::array添加重载,使用迭代器创建一个具有泛型范围的构造函数怎么样?虽然只有当你真的可以修改这个类时,它才起作用。@Someprogrammerdude也是一个好主意,但在这种情况下,我希望我不必接触给定的API。但我会考虑的。谢谢,为什么不向接受std::array的构造函数集添加重载呢?不,这是不可能的。实际上,您只能显式创建一个空的,因为没有向其中添加元素的功能。@NathanOliver这只是因为Foo类来自其他API,所以我想知道是否可以更有效地使用此构造函数。至于另一种可能的解决方案,而是为std::array添加重载,使用迭代器创建一个具有泛型范围的构造函数怎么样?虽然只有当你真的可以修改这个类时,它才起作用。@Someprogrammerdude也是一个好主意,但在这种情况下,我希望我不必接触给定的API。但我会考虑的。谢谢