gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:55:14 27 4
gpt4 key购买 nike

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

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

如果我尝试用它的相应 protobuf 替换 SomeStruct,它会提示“没有匹配的构造函数用于初始化”SomeStructProto 和“无法将初始化列表参数转换为”SomeStructProto。这是有道理的,因为在生成的 protobuf 代码中没有为此的构造函数,并且字段是私有(private)的。

我想尽可能少地修改代码的使用方式。有没有办法构建一个像正确的构造函数一样工作的函数或辅助类?像这样的东西:
  SomeStruct instance = SomeStructConversionFunction ({
"some string",
{"an", "array", "of", "strings",},
SomeEnum::SomeValue,
});

到目前为止,这是我的尝试,只是想看看我是否可以编译它:
SomeStructProto SomeStructConversionFunction(
std::initializer_list<SomeStructProto> config) {
return SomeStructProto();
}

但编译器提示“第一个参数没有从 'const char [1]' 到 'SomeStructProto' 的已知转换”。

我对最终结果的工作方式非常灵活,我只是不想最终得到很多 some_struct.set_some_field("some string")。有任何想法吗?

最佳答案

你在这里要做的是aggregate intialization .
即使是最新的syntax = "proto3";版本,我不认为这是一种可能性。
根据 issue在 Protocol Buffer 存储库中:

It seems that aggregate init is not compatible with the primary goals of protobuf. Namely provide a stable back and forwards compatible extensible protocol, both on the wire and as a programming library.



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

关于c++ - 用于 protobuf 转换的 Braced-init 样式构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44055212/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com