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插件和代码生成器,我会非常感谢如何实现这一目标。