C++模板从成员变量或成员函数中读取值
C++ template to read value from member variable or member function
我正在编写代码生成器并使用平面缓冲区生成 类。代码生成器的其余部分将在 C++ 中使用这些 类。
我无法弄清楚如何使 API 保持一致以读取 flatbuffer 可能生成的两种不同类型的 类 的数据。我在示例中使用对象 api (testRecordT) 来表示何时需要写入对象(并且也可以读回),以及何时只能从中读取数据时使用平面缓冲区覆盖。
我无法获得任何模板或免费功能来为我提供一致的 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)
}
读取函数或模板函数要一致。任何指示或想法都会有所帮助。我在 gcc 7.3.1 中使用 C++17。
您可以为此使用 std::invoke
。它既可以调用函数也可以访问成员。
auto r = std::invoke(&testRecordT::field1, members);
auto v = std::invoke(&testRecord::field1, memberFunctions);
你可以用std::invoke()
来解决这个问题。
我正在编写代码生成器并使用平面缓冲区生成 类。代码生成器的其余部分将在 C++ 中使用这些 类。
我无法弄清楚如何使 API 保持一致以读取 flatbuffer 可能生成的两种不同类型的 类 的数据。我在示例中使用对象 api (testRecordT) 来表示何时需要写入对象(并且也可以读回),以及何时只能从中读取数据时使用平面缓冲区覆盖。
我无法获得任何模板或免费功能来为我提供一致的 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)
}
读取函数或模板函数要一致。任何指示或想法都会有所帮助。我在 gcc 7.3.1 中使用 C++17。
您可以为此使用 std::invoke
。它既可以调用函数也可以访问成员。
auto r = std::invoke(&testRecordT::field1, members);
auto v = std::invoke(&testRecord::field1, memberFunctions);
你可以用std::invoke()
来解决这个问题。