Я пишу генератор кода и использую плоские буферы для генерации классов. Остальная часть генератора кода будет работать с этими классами в C ++.
Я не смог выяснить, как обеспечить согласованность API для чтения данных для двух разных типов классов, которые может генерировать flatbuffer. Я использую объект api (testRecordT) в этом примере для случаев, когда объект должен быть записан (и может быть также прочитан), и наложения плоского буфера для случаев, когда данные могут быть прочитаны только из.
IЯ не смог заставить работать ни один шаблон или бесплатные функции, чтобы дать мне непротиворечивый API, который работал бы в обоих случаях.
Ниже приведен фрагмент того, что я пытаюсь заставить работать.
struct testRecordT {
int32_t field1;
std::string field2;
};
struct testRecord {
int32_t field1() const {
return 0;
// flatbuffer generated - return GetField<int32_t>(VT_FIELD1, 0);
}
const flatbuffers::String *field2() const {
return nullptr;
// flatbuffer generated - return GetPointer<const flatbuffers::String *>(VT_FIELD3);
}
};
void Test() {
testRecordT * members; // assume pointers are valid
testRecord * memberFunctions;
// Need to be able to create a read function/template that would work. This would simplify the code generation a lot. I can generate either one below, as long as it is consistent in both cases.
auto r = read(members->field1); // or read(members,field1)
auto v = read(memberFunctions->field1); // or read(memberFunctions,field1)
}
Функции чтения или функции шаблона должны быть согласованными. Любые указатели или мысли будут полезны. Я использую C ++ 17 с gcc 7.3.1.