如何从Protobuf RepeatedField填充std::array?支持聚合初始化吗?
解决方案
更简洁的std::array填充方式
你当前的循环写法可行,但可以借助标准库算法std::copy简化代码,利用RepeatedField的迭代器接口完成填充:
std::array<int, 6> entry; std::copy(msg.items().begin(), msg.items().end(), entry.begin());
由于你已明确RepeatedField恰好包含6个元素,这里可省略断言;若需要额外校验元素数量匹配,可在拷贝前添加:
assert(msg.items().size() == 6);
结构体聚合初始化中使用RepeatedField
直接用迭代器对std::array做聚合初始化或赋值不可行——std::array是聚合类型,不支持通过迭代器构造或赋值,你尝试的entry = {msg.items().begin(), msg.items().end()}本质是想用两个迭代器构造初始化列表,但std::array的赋值运算符不接受这种形式。
要实现结构体聚合初始化时直接用RepeatedField填充std::array,可编写一个通用辅助转换函数:
template <typename T, size_t N> std::array<T, N> repeated_field_to_array(const RepeatedField<T>& field) { assert(field.size() == N); std::array<T, N> result; std::copy(field.begin(), field.end(), result.begin()); return result; }
之后在结构体聚合初始化时调用该函数即可:
struct MyStruct { std::array<int, 6> entry; // 其他成员变量 }; // 聚合初始化结构体 MyStruct my_struct = {repeated_field_to_array<int, 6>(msg.items())};
内容的提问来源于stack exchange,提问作者Dávid Tóth
相关产品推荐
相关产品推荐

