首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么protobuf CopyFrom() & MergeFrom()适用于每种消息类型?

为什么protobuf CopyFrom() & MergeFrom()适用于每种消息类型?
EN

Stack Overflow用户
提问于 2022-07-26 07:37:10
回答 1查看 514关注 0票数 1

在我使用所有编译器(g++/Linux、clang/Mac、msvc/Windows)的protobuf设置中看到了一个奇怪的问题。它的最小形式如下:

代码语言:javascript
运行
复制
message A {  // declare objA
  int32 i;
}
message B {  // declare objB
  string s;
  repeated bytes rb;
}

...
objA.CopyFrom(objB);  // No compiler error?!

我以为CopyFrom() (或MergeFrom())会出现编译器错误,比如“没有匹配的函数调用.”。但是它在所有环境中都很好!.pb.h中的方法声明看起来很好。它只希望输入A。不过,它给出了其他非原型类型的编译器错误。

这是什么虫子吗?

EN

回答 1

Stack Overflow用户

发布于 2022-07-27 03:17:29

为什么CopyFrom() & MergeFrom()适用于每种消息类型?

因为有一个重载版本的CopyFromMergeFrom

代码语言:javascript
运行
复制
void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final;
void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final;

因为B是从Message派生的,所以没有编译器错误。

但是,如果试图复制或合并两种不同类型,运行时检查将失败,并引发异常。

代码语言:javascript
运行
复制
[libprotobuf FATAL protobuf/src/google/protobuf/reflection_ops.cc:74] CHECK failed: (to->GetDescriptor()) == (descriptor): Tried to merge messages of different types (merge B to A)
libc++abi: terminating with uncaught exception of type google::protobuf::FatalException: CHECK failed: (to->GetDescriptor()) == (descriptor): Tried to merge messages of different types (merge B to A)
Abort trap: 6

为什么存在这些过载?

因为您可以使用protobuf反射动态创建一个真实类型为MessageA (反射接口返回基类,即Message,而不是真实类型)。在这种情况下,您可以使用这些重载从动态生成的Message复制或合并。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73119418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档