在我正在使用的库的上下文中,创建一个类型,如
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++代码中提取这些信息,但你可能会因此而自食其果。