根据结构的名称及其成员的名称和类型生成代码(包括字符串和派生标识符)



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

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++标准(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++代码中提取这些信息,但你可能会因此而自食其果。

最新更新