Dav*_*óth 4 c++ protocol-buffers c++17
从定义为具有精确N
元素的 RepeatedField 中,我正在填充一个 std::array 。
std::array<int, 6> entry;
size_t i = 0;
for (const auto& item: msg.items()){
assert(i < 6);
entry[i++] = item;
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但是有更好的方法来初始化它吗?填充 std::vector 可以很好地处理初始化列表,但 std::array确实不同。
是否可以在包含 的结构体的聚合初始化中使用 RepeatedFields std::array
?
到目前为止我所尝试的甚至无法编译:
entry = {msg.items().begin(), msg.items().end()};
Run Code Online (Sandbox Code Playgroud)
这是可以理解的,因为 std::array 没有接受std::initializer_list
;的构造函数。但我正在尝试做的事情可能吗?
你可以尝试使用STL算法
std::array<int, 6> entry;
assert(msg.items_size() == std::size(entry));
std::copy(std::begin(msg.items()), std::end(msg.items()), begin(entry));
Run Code Online (Sandbox Code Playgroud)
或者,如果您有多种这样的情况,您可以编写辅助函数。
template<typename T, size_t N, typename R, size_t...I>
std::array<T, N> range_to_array_impl(R&& r, std::index_sequence<I...>)
{
return { r[I]... };
}
template<typename T, size_t N, typename R>
std::array<T, N> range_to_array(R&& r)
{
assert(std::size(r) == N);
return range_to_array_impl<T, N>(std::forward<R>(r), std::make_index_sequence<N>{});
}
// use:
auto entry = range_to_array<int, 6>(msg.items());
Run Code Online (Sandbox Code Playgroud)
https://godbolt.org/z/zEjorr7Tx