std::initializer 来自现有 std::array 的列表,不枚举每个元素
std::initializer list from already existing std::array without enumerating each element
假设我有一个 class 具有以下构造函数:
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
,而不枚举每个数组元素吗?
不,你做不到。这个 API 只接受一个 initializer_list
并且没有接受一对迭代器或一个指针加上一个大小的设施,这是有缺陷的。在野外,您几乎永远不会看到这样的 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);
}
假设我有一个 class 具有以下构造函数:
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
,而不枚举每个数组元素吗?
不,你做不到。这个 API 只接受一个 initializer_list
并且没有接受一对迭代器或一个指针加上一个大小的设施,这是有缺陷的。在野外,您几乎永远不会看到这样的 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);
}