std::初始值设定项列表来自现有的 std::array,而不枚举每个元素

std::initializer list from already existing std::array without enumerating each element

本文关键字:std array 枚举 元素 列表      更新时间:2023-10-16

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

class Foo {
Foo(std::initializer_list<uin8_t> args)
{
....
}
}

我有以下数组:std::array<uint8_t, 6> bar.

现在我想使用bar数组创建一个foo的对象。有没有其他方法可以以以下方式进行:

Foo f (bar[0], bar[1], bar[2], bar[3], bar[4], bar[5]);

这种方式似乎有点复杂,感觉这不是它应该的方式。

那么,我可以从现有的数组创建std::initializer list,而不枚举每个数组元素吗?

不,你不能这样做。 这个只接受initializer_list并且没有能力接受一对迭代器或指针加大小的 API 是有缺陷的。 你几乎永远不会在野外看到这样的 API。

由于您无法修改"Foo",因此您可以创建自己的make_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);
}