Как добавить повторяющееся поле с помощью буфера протокола Google на С++?

У меня есть буфер протокола ниже. Обратите внимание, что StockStatic — это повторяющееся поле.

message ServiceResponse
{
    enum Type
    {
        REQUEST_FAILED = 1;
        STOCK_STATIC_SNAPSHOT = 2;
    }

    message StockStaticSnapshot
    {
        repeated StockStatic stock_static = 1;
    }
    required Type type = 1;
    optional StockStaticSnapshot stock_static_snapshot = 2;
}

message StockStatic
{
    optional string sector      = 1;
    optional string subsector   = 2;
}

Я заполняю поля StockStatic, перебирая вектор.

ServiceResponse.set_type(ServiceResponse_Type_STOCK_STATIC_SNAPSHOT);

ServiceResponse_StockStaticSnapshot stockStaticSnapshot;

for (vector<stockStaticInfo>::iterator it = m_staticStocks.begin(); it!= m_staticStocks.end(); ++it)
{
    StockStatic* pStockStaticEntity = stockStaticSnapshot.add_stock_static();

    SetStockStaticProtoFields(*it, pStockStaticEntity); // sets sector and subsector field to pStockStaticEntity by reading the fields using (*it)
}

Но приведенный выше код верен только в том случае, если StockStatic является необязательным полем, а не повторяющимся полем. Мои вопросы: какую строку кода мне не хватает, чтобы сделать его повторяющимся полем?


person aajkaltak    schedule 20.11.2009    source источник
comment
Просто любопытно, с какой именно проблемой вы сталкиваетесь, когда повторяете это?   -  person VNarasimhaM    schedule 20.11.2009


Ответы (3)


Нет, ты поступаешь правильно.

Вот фрагмент моего буфера протокола (детали опущены для краткости):

message DemandSummary
{
    required uint32 solutionIndex     = 1;
    required uint32 demandID          = 2;
}
message ComputeResponse
{
    repeated DemandSummary solutionInfo  = 3;
}

...и C++ для заполнения ComputeResponse::solutionInfo:

ComputeResponse response;

for ( int i = 0; i < demList.size(); ++i ) {

    DemandSummary* summary = response.add_solutioninfo();
    summary->set_solutionindex(solutionID);
    summary->set_demandid(demList[i].toUInt());
}

response.solutionInfo теперь содержит demList.size() элементов.

person leegent    schedule 20.11.2009
comment
Спасибо .. Я только что понял, что вызов response-›add_solutioninfo() ---- добавляет более 1 элемента .. спасибо! - person aajkaltak; 20.11.2009
comment
DemandSummary* summary = response->add_solutioninfo(); следует изменить на DemandSummary* summary = response.add_solutioninfo(); По какой-то причине stackoverflow говорит, что предлагаемая очередь редактирования заполнена - person Allen Wang; 11.03.2021

Другой способ сделать то же самое:

message SearchResponse {
  message Result {
  required string url = 1;
  optional string title = 2;
  repeated string snippets = 3;
  }  
  repeated Result result = 1;
}
person VNarasimhaM    schedule 20.11.2009
comment
для повторяющегося фрагмента строки какой будет код cpp? - person Rohan Nagalkar; 07.02.2018

Вот пример кода С++, но он может быть неэффективным:

message MyArray
{
    repeated uint64 my_data = 1;
}
//Copy
std::array<unsigned long long, 5> test={1,1,2,3,5};
mynamespace::MyArray pbvar;
auto *dst_ptr = keys.my_data();
google::protobuf::RepeatedField<google::protobuf::uint64> field{test.begin(), test.end()};
dst_ptr->CopyFrom(field);

//Output
for (auto it : pbvar.my_data())
    std::cout<<it<<" ";
std::cout<<std::endl;
person vrqq    schedule 10.01.2021