用于protobuf转换的Braced-init样式构造函数

时间:2017-05-18 18:20:09

标签: c++ c++11 gcc protocol-buffers

我有一些C ++ 11结构和类,我试图支持或替换为protobufs。我有一个使用聚合初始化样式在几个地方初始化的结构,如下所示:

  SomeStruct instance ({
    "some string",
    {"an", "array", "of", "strings",},
    SomeEnum::SomeValue,
  });

如果我尝试用它的相应protobuf替换SomeStruct,它会抱怨没有匹配的构造函数来初始化" SomeStructProto和"无法将初始化列表参数转换为" SomeStructProto。这是有道理的,因为在生成的protobuf代码中没有这样的构造函数,并且字段是私有的。

我想尽可能少地修改代码的使用方式。有没有办法构建一个像正确的构造函数一样的函数或辅助类?像这样:

  SomeStruct instance = SomeStructConversionFunction ({
    "some string",
    {"an", "array", "of", "strings",},
    SomeEnum::SomeValue,
  });

这是我到目前为止的尝试,只是为了看看我是否可以编译它:

SomeStructProto SomeStructConversionFunction(
    std::initializer_list<SomeStructProto> config) {
  return SomeStructProto();
}

但编译器抱怨&#34;没有来自&#39; const char [1]&#39;到了SomeStructProto&#39;第一个论点&#34;。

我对最终结果如何运作非常灵活,我不想最终得到很多some_struct.set_some_field(&#34;一些字符串&#34;)。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您要在此处进行的操作是aggregate intialization。 即使使用最新的syntax = "proto3";版本,我也不认为有这种可能。 根据协议缓冲区存储库中的issue

  

似乎聚合初始化与protobuf的主要目标不兼容。即既可以在线上又可以作为编程库提供稳定的前后兼容的可扩展协议。

因此,这里鼓励的解决方案是为您的消息创建包装器类,您可以在其中编写聚合初始化。从需要为消息创建更复杂的实用程序的角度来看,创建包装器类也是一个好主意。