protobuf的C ++包装器

时间:2015-01-16 10:02:12

标签: c++ design-patterns wrapper protocol-buffers

stackoverflowers,

我对C ++并不熟悉,所以我的问题可能与糟糕的设计或某种程度有关。

反正:

我有一个带有多个嵌套的protobuf生成的类,我想以某种方式以优雅的方式包装所有这些。

原:

message ChunkConfigInfo
{
  required uint32 max_size = 1 [default = 65536];
}

message BundleConfigInfo
{
  required uint32 max_payload_size = 2 [default = 0x200000];
  optional string default_compression_method = 3 [default = "lzma"];
}

message ConfigInfo
{
  required ChunkConfigInfo chunk = 1;
  required BundleConfigInfo bundle = 2;
}

这些定义由protobuf翻译成ConfigInfo类,至少有以下方法:

inline const ::BundleConfigInfo& bundle() const;
inline ::BundleConfigInfo* mutable_bundle();
[..]
inline const ::ChunkConfigInfo& chunk() const;
inline ::ChunkConfigInfo* mutable_chunk();

BundleConfigInfo有以下方法:

inline const ::std::string& default_compression_method() const;
inline void set_default_compression_method(const ::std::string& value);

等等。

目前我可以像这样使用它们:

// brain-compiled code
ConfigInfo configInfo;
configInfo.mutable_bundle()->set_default_compression_method( .. ); //set value
string compression( configInfo.bundle().default_compression_method() ); //get value

我想要实现的目标:

我想为所有可以执行某些验证(基于类型)的ChunkConfigInfo和BundleConfigInfo成员提供一个包装器,以便我可以按照以下方式使用它们:

// brain-compiled code
ConfigInfoWrapper configInfo;
// please note that only single method is used for assigning and getting values:
configInfo.bundle()->default_compression_method( .. ); //set value
string compression( configInfo.bundle()->default_compression_method() ); //get value

或类似的东西。

我可以使用一些生成所有适当方法的代码生成器来实现这个包装器,但这种方法有一个严重的缺点:我需要将protobuf定义与代码生成器定义一起维护。

另一种方法是实现protobuf插件,但这似乎容易受到protobuf内部更改的影响。

是否可以使用C ++模板和预处理器功能以某种方式实现?

如果没有protobuf插件和代码生成器,我会非常感谢如何实现这一目标。

0 个答案:

没有答案