繁体   English   中英

C++ 模板从成员变量或成员 function 中读取值

[英]C++ template to read value from member variable or member function

我正在编写代码生成器并使用平面缓冲区来生成类。 代码生成器的 rest 将与 C++ 中的这些类一起使用。

我无法弄清楚如何保持 API 一致,以便读取 flatbuffer 可能生成的两种不同类型的类的数据。 我在示例中使用 object api (testRecordT) 用于每当需要写入 object 时(也只能读回)并且可以从平面缓冲区覆盖读取

我无法获得任何模板或免费功能来为我提供一致的 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。

您可以为此使用std::invoke 它既可以调用函数也可以访问成员。

auto r = std::invoke(&testRecordT::field1, members);
auto v = std::invoke(&testRecord::field1, memberFunctions);

你可以使用std::invoke()来解决这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM