【问题标题】:Generating code (including strings and derived identifiers) from the name of a struct and the names and types of its members从结构的名称及其成员的名称和类型生成代码(包括字符串和派生标识符)
【发布时间】:2021-05-03 09:56:26
【问题描述】:

在我正在使用的库的上下文中,创建一个类型,例如

struct my_name_t {
  int aaa;
  double bbb;
};

要求用户也定义和调用

HF::CompoundType create_my_name_type() {
  return {{"aaa", HF::AtomicType<int>{}},
          {"bbb", HF::AtomicType<double>{}}};
}

HIGHFIVE_REGISTER_TYPE(my_name_t, create_my_name_type)

第二个块是 100% 样板:第二个块中的每个字符都是第一个块内容的纯函数。唯一可以改变的是

  • 结构的名称,
  • 其成员的类型和名称。

此信息完全指定了其他所有内容。

可以使用哪些 C++ 元编程技术

  • 从第一个块生成第二个块,或者
  • 根据一些通用规范生成两者?

【问题讨论】:

    标签: c++ metaprogramming


    【解决方案1】:

    在当前的 C++ 标准(C++20)中不支持反射,也就是说,不可能获得成员名称和类型的列表。

    (有一些关于在 C++23 中添加“静态反射”的讨论,但不确定这是否仍然是最新的。)

    在实践中,您可以编写这种冗余代码,或者,如果您正在讨论许多类,通常从一些 DSL(域特定语言)生成它:

    // file: X.struct
    
    type X {
      x: int
      y: std::string
    }
    
    // file: X.generated.hpp
    
    struct X {
      int x;
      std::string y;
    };
    
    // file: X.generated.cpp
    
    static MyCustomReflectionType info()
    {
        return {
          { "x", "int" },
          { "y", "std::string" },
        };
    }
    
    REGISTER_TYPE(X, info);
    

    如果您需要添加自定义方法,您通常会自己生成基类并实现派生类。

    您还可以做一些混合代码/生成的事情,您可以尝试从 C++ 代码中提取该信息,但您可能会因此而自取其辱。

    【讨论】:

    猜你喜欢
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多