Это возможно с Google Буферы протокола чтобы получить поле название (не тип поля) родительского сообщения с использованием дескрипторов в C ++?
Рассмотрим следующий минимальный пример:
message MessageHeader {
string addressee = 1;
}
message Message {
MessageHeader header = 1;
}
Я хочу получить строку "header.addresse"
со следующей функцией:
std::string createFieldQueryFrom(
const google::protobuf::FieldDescriptor* const descriptor)
{
// TODO(wolters): The descriptor for the containing FIELD is required. Is
// there a way to retrieve it?
//
// containing_descriptor->name() returns "Message", what I want is
// "header"!
const google::protobuf::Descriptor* containing_descriptor{
descriptor->containing_type()};
// TODO(wolters): Add recursion if able to get the actual attribute name of
// the containing FIELD.
return "";
}
google::protobuf::FieldDescriptor
Например, предоставить информацию, необходимую для выполнения этой задачи?FieldDescriptor::name()
(например. descriptor->name()
в вашем примере) возвращает имя поля. Однако это только «заголовок» или «адресат», а не целый путь, такой как «header.addressee».
Нет способа создать целый путь из одного FieldDescriptor
потому что он не содержит достаточно информации. Тип MessageHeader
может быть использован во многих разных местах (не только в Message.header
), поэтому с учетом дескриптора для addressee
В одиночку нет способа узнать, какой сайт вы искали.
Если вы хотите отслеживать путь поля при прохождении сообщения, вам нужно будет сделать это вручную, поддерживая stack<FieldDescirptor*>
или похожие.
Других решений пока нет …