Как добавить вектор в повторяющееся поле protobuf c ++ - PullRequest
0 голосов
/ 10 октября 2018

У меня есть следующее сообщение 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

на основе Скопировать std :: vector в повторное поле из protobuf с помощью 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

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Вы должны выполнить итерацию по данному вектору и вручную добавить объекты в ваше сообщение 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);
}
0 голосов
/ 10 октября 2018

Метод mutable_proposedsegments() возвращает указатель, поэтому в начале может отсутствовать * - попробуйте:

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).

...