Вы устанавливаете его так же, как и поле, если оно не было частью oneof
.Получите FieldDescriptor
из сообщения Descriptor
и передайте его соответствующему SetXXX
методу сообщения Reflection
.
. Получив сообщение, подобное следующему:
message Foo
{
oneof bar
{
int32 a = 1;
string b = 2;
}
}
Вы можете установить элемент a
следующим образом:
#include "foo.pb.h"
int main()
{
Foo f;
const google::protobuf::Descriptor* d = f.GetDescriptor();
const google::protobuf::FieldDescriptor* a = d->FindFieldByName("a");
const google::protobuf::Reflection* r = f.GetReflection();
r->SetInt32(&f, a, 42);
}
Protobuf позаботится о том, чтобы все ранее установленные элементы oneof
были сброшены при необходимости.