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

setting repeated field in protobuf using reflection

我有一个类似这样的 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 函数内崩溃。以前有没有人试过做这样的事情? (使用反射设置值?请注意,由于我的应用程序的动态特性,我必须使用反射。我稍微简化了上面的代码,暂时不这样做)

也欢迎任何关于如何调试的提示。

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

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