如何将向量添加到重复字段 protobuf C++
How to add vector to repeated field protobuf c++
我有以下 protobuf 消息:
message gen_Journey {
repeated gen_ProposedSegment proposedSegments = 1;
}
生成的cpp如下
// repeated .gen_ProposedSegment proposedSegments = 1;
int gen_Journey::proposedsegments_size() const {
return proposedsegments_.size();
}
void gen_Journey::clear_proposedsegments() {
proposedsegments_.Clear();
}
const ::gen_ProposedSegment& gen_Journey::proposedsegments(int index) const {
// @@protoc_insertion_point(field_get:gen_Journey.proposedSegments)
return proposedsegments_.Get(index);
}
::gen_ProposedSegment* gen_Journey::mutable_proposedsegments(int index) {
// @@protoc_insertion_point(field_mutable:gen_Journey.proposedSegments)
return proposedsegments_.Mutable(index);
}
::gen_ProposedSegment* gen_Journey::add_proposedsegments() {
// @@protoc_insertion_point(field_add:gen_Journey.proposedSegments)
return proposedsegments_.Add();
}
::google::protobuf::RepeatedPtrField< ::gen_ProposedSegment >*
gen_Journey::mutable_proposedsegments() {
// @@protoc_insertion_point(field_mutable_list:gen_Journey.proposedSegments)
return &proposedsegments_;
}
const ::google::protobuf::RepeatedPtrField< ::gen_ProposedSegment >&
gen_Journey::proposedsegments() const {
// @@protoc_insertion_point(field_list:gen_Journey.proposedSegments)
return proposedsegments_;
}
我创建了以下向量:
std::vector<gen_ProposedSegment *> proposedSegment
基于 Copy a std::vector to a repeated field from protobuf with memcpy 我做了以下操作:
Journey::Journey(std::vector<gen_ProposedSegment *> proposedSegment) {
this->mutable_proposedsegments() = {proposedSegment.begin(), proposedSegment.end()};
}
问题是我收到以下错误:
/home/compilation/UnixPackagesFareShopping/src/DOM/src/journey.cpp:10:35: error: lvalue required as left operand of assignment
我做错了什么?
mutable_proposedsegments()
方法 returns 一个指针,因此您可能在开头缺少 *
- 尝试使用:
Journey::Journey(std::vector<gen_ProposedSegment *> proposedSegment) {
*this->mutable_proposedsegments() = {proposedSegment.begin(), proposedSegment.end()};
}
此外,要使其正常工作,您需要将输入键入 std::vector<gen_ProposedSegment>
(最好使用 const ref),即:
Journey::Journey(const std::vector<gen_ProposedSegment>& proposedSegment) {
*this->mutable_proposedsegments() = {proposedSegment.begin(), proposedSegment.end()};
}
或者,您需要在 for 循环中插入项目(参见 std::for_each
)。
您必须迭代给定的向量并手动将对象添加到您的 protobuf 消息中。您不能为此使用 memcpy 操作。
以下代码是我在没有测试的情况下凭空写出来的……但应该能为您指明正确的方向。顺便说一句:在这种情况下,我假设 Journey
继承自 gen_Journey
。否则,您必须相应地调整 "this->" 语句。
Journey::Journey(const std::vector<gen_ProposedSegment *> &proposedSegment) {
auto copy = [&](const gen_ProposedSegment *) {
auto temp_seg = this->add_proposedsegments();
temp_seg->CopyFrom(*gen_ProposedSegment);
};
std::for_each(proposedSegment.cbegin(), proposedSegment.cend(), copy);
}
我有以下 protobuf 消息:
message gen_Journey {
repeated gen_ProposedSegment proposedSegments = 1;
}
生成的cpp如下
// repeated .gen_ProposedSegment proposedSegments = 1;
int gen_Journey::proposedsegments_size() const {
return proposedsegments_.size();
}
void gen_Journey::clear_proposedsegments() {
proposedsegments_.Clear();
}
const ::gen_ProposedSegment& gen_Journey::proposedsegments(int index) const {
// @@protoc_insertion_point(field_get:gen_Journey.proposedSegments)
return proposedsegments_.Get(index);
}
::gen_ProposedSegment* gen_Journey::mutable_proposedsegments(int index) {
// @@protoc_insertion_point(field_mutable:gen_Journey.proposedSegments)
return proposedsegments_.Mutable(index);
}
::gen_ProposedSegment* gen_Journey::add_proposedsegments() {
// @@protoc_insertion_point(field_add:gen_Journey.proposedSegments)
return proposedsegments_.Add();
}
::google::protobuf::RepeatedPtrField< ::gen_ProposedSegment >*
gen_Journey::mutable_proposedsegments() {
// @@protoc_insertion_point(field_mutable_list:gen_Journey.proposedSegments)
return &proposedsegments_;
}
const ::google::protobuf::RepeatedPtrField< ::gen_ProposedSegment >&
gen_Journey::proposedsegments() const {
// @@protoc_insertion_point(field_list:gen_Journey.proposedSegments)
return proposedsegments_;
}
我创建了以下向量:
std::vector<gen_ProposedSegment *> proposedSegment
基于 Copy a std::vector to a repeated field from protobuf with memcpy 我做了以下操作:
Journey::Journey(std::vector<gen_ProposedSegment *> proposedSegment) {
this->mutable_proposedsegments() = {proposedSegment.begin(), proposedSegment.end()};
}
问题是我收到以下错误:
/home/compilation/UnixPackagesFareShopping/src/DOM/src/journey.cpp:10:35: error: lvalue required as left operand of assignment
我做错了什么?
mutable_proposedsegments()
方法 returns 一个指针,因此您可能在开头缺少 *
- 尝试使用:
Journey::Journey(std::vector<gen_ProposedSegment *> proposedSegment) {
*this->mutable_proposedsegments() = {proposedSegment.begin(), proposedSegment.end()};
}
此外,要使其正常工作,您需要将输入键入 std::vector<gen_ProposedSegment>
(最好使用 const ref),即:
Journey::Journey(const std::vector<gen_ProposedSegment>& proposedSegment) {
*this->mutable_proposedsegments() = {proposedSegment.begin(), proposedSegment.end()};
}
或者,您需要在 for 循环中插入项目(参见 std::for_each
)。
您必须迭代给定的向量并手动将对象添加到您的 protobuf 消息中。您不能为此使用 memcpy 操作。
以下代码是我在没有测试的情况下凭空写出来的……但应该能为您指明正确的方向。顺便说一句:在这种情况下,我假设 Journey
继承自 gen_Journey
。否则,您必须相应地调整 "this->" 语句。
Journey::Journey(const std::vector<gen_ProposedSegment *> &proposedSegment) {
auto copy = [&](const gen_ProposedSegment *) {
auto temp_seg = this->add_proposedsegments();
temp_seg->CopyFrom(*gen_ProposedSegment);
};
std::for_each(proposedSegment.cbegin(), proposedSegment.cend(), copy);
}