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()来解决这个问题。