如何获取protobuf某个字段的类型? 比如 message A{ int a1 = 1; google.protobuf.DoubleValue a2 = 2 } 我想要有一个函数,我传a2,给我返回值为google.protobuf.DoubleValue,请使用C++语言
时间: 2023-08-02 10:15:48 浏览: 135
可以使用反射来获取protobuf某个字段的类型。在C++中,需要使用反射的API,即`Reflection`类和`FieldDescriptor`类。
示例代码如下:
```c++
#include <google/protobuf/message.h>
#include <google/protobuf/descriptor.h>
using google::protobuf::Message;
using google::protobuf::Reflection;
using google::protobuf::FieldDescriptor;
const FieldDescriptor* GetFieldDescriptor(const Message& message, const std::string& field_name) {
const Reflection* reflection = message.GetReflection();
const FieldDescriptor* field_descriptor = reflection->FindFieldByName(field_name);
return field_descriptor;
}
const std::string GetFieldValueTypeName(const Message& message, const std::string& field_name) {
const FieldDescriptor* field_descriptor = GetFieldDescriptor(message, field_name);
if (field_descriptor == nullptr) {
return "";
}
return FieldDescriptor::TypeToString(field_descriptor->type());
}
```
其中,`GetFieldDescriptor`函数用于获取指定字段名的`FieldDescriptor`对象,`GetFieldValueTypeName`函数用于获取指定字段名的类型名。使用示例如下:
```c++
A a;
const std::string field_type_name = GetFieldValueTypeName(a, "a2");
std::cout << field_type_name << std::endl; // 输出 "google.protobuf.DoubleValue"
```
阅读全文