使用我自己的方法扩展Protobuf

siv*_*udh 10 c++ protocol-buffers

我应该如何添加Protobuf消息的方法?

假设我在.proto文件中:

package proto;
message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;    
}
Run Code Online (Sandbox Code Playgroud)

我想concatenateNameEmail()在消息中添加一个方法,比如字符串.

我现在做的是我创建自己的C++类,如下所示:

class Person : public proto::Person
{
public:
  Person( proto::Person const & person_ )
  : proto::Person(person_)
  {}

  string concateNateNameEmail()
  {
   ...
  }
};
Run Code Online (Sandbox Code Playgroud)

所以缺点是我需要调用proto :: Person复制构造函数.有比这更优雅的解决方案吗?

DS.*_*DS. 14

Google Protobufs特别不打算扩展.以下是文档中的段落(在此中间:http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html):

协议缓冲区和OO设计协议缓冲区类基本上是哑数据持有者(如C++中的结构); 他们没有在对象模型中成为优秀的一等公民.如果要为生成的类添加更丰富的行为,最好的方法是将生成的协议缓冲区类包装在特定于应用程序的类中.... 永远不要通过继承它们来为生成的类添加行为.这将打破内部机制,无论如何都不是良好的面向对象的实践.

如果你只想要一个方法,我可以看到这样的建议看起来很烦人,但总的来说这是一个很好的建议.如果您确实没有其他功能可以保证创建特定于应用程序的"Person"类,那么定义顶级函数没有任何问题:

string concatenateNameEmail(const proto::Person &person) { ... }
Run Code Online (Sandbox Code Playgroud)