使用反射在protobuf中设置重复的字段

时间:2017-02-01 18:43:38

标签: c++ protocol-buffers

我有一条类似于此的protobuf消息:

message foo {
   repeated double values = 1;
}

我正在使用反射(如here所述)在我的C ++代码中设置这样的值

auto desc = protoMsg.GetDescription();
auto refl = protoMsg.GetReflection();
auto fd = desc->FindFieldByNumber(1); // run time value

assert(fd->is_repeated());
for (int i = 0; i < vect.size(); ++i)
   refl->SetRepeatedDouble(&protoMsg, fd, i, vect[i]);

我的应用程序在SetRepeatedDouble函数内崩溃。以前有人试过这样的事吗? (使用反射设置值?请注意,由于我的应用程序的动态特性,我必须使用反射。我已经简化了上面的代码,暂时没有这样做)

此外,有关如何调试此功能的任何提示均表示赞赏。

1 个答案:

答案 0 :(得分:3)

SetRepeatedDouble()会覆盖数组中已存在的元素。为了使您的代码工作,重复字段的大小必须至少等于vect.size(),否则您将超出阵列,这确实会导致崩溃(或更糟)。如果您开始使用空消息实例,则需要添加值而不是设置它们,如下所示:

for (int i = 0; i < vect.size(); ++i)
    refl->AddDouble(&protoMsg, fd, vect[i]);