跳到主要内容
Generative Metaprogramming

GMP 文档中心

面向编译时代码生成的 C++ 元编程库,帮助你用更清晰的方式组织宏、反射、命名操作符与通用基础设施。

Header-onlyC++20ReflectionMIT
example.cpp
struct Person {
std::string name;
int age;
};
static_assert(gmp::type_name<Person>() == "Person");
static_assert(gmp::member_count<Person>() == 2);
static_assert(gmp::member_name<0, Person>() == "name");
static_assert(gmp::member_name<1, Person>() == "age");

核心能力

围绕表达力与编译期生成效率构建的元编程基础模块。

宏元编程

提供布尔逻辑、算术、tuple 操作、循环与宏重载分发等预处理器工具。

反射元编程

在 C++20 下提供固定字符串、类型与枚举反射等编译期反射能力。

命名操作符

提供更具表达力的中缀 DSL 风格命名操作符,提升模板与元编程代码可读性。

通用设计模式

包含单例与对象工厂等轻量基础设施组件。

实践代码

用几个真实片段快速感受 GMP 在项目里的使用方式。

#define PRINT(x) std::cout << x << " ";
GMP_FOR_EACH(PRINT, 1, 2, 3) // Expands to: std::cout << 1 << " "; std::cout << 2 << " "; std::cout << 3 << " ";

#define Bar(arg1, arg2) bar(arg1, arg2);
GMP_REPEAT(Bar, 3, 1, "arg2") // Expands to: bar(1, "arg2"); bar(2, "arg2"); bar(3, "arg2");

GMP_OVERLOAD_INVOKE(OVERLOAD_FUNCTION, X, Y, Z) // expands to: "OVERLOAD_FUNCTION_X_Y_Z"

GMP_MAKE_INDEX_SEQUENCE(5) // expands to: 0, 1, 2, 3, 4
GMP_RANGE(5, 10) // expands to: 5, 6, 7, 8, 9

GMP_GENERATE_NAMESPACES_BEGIN(mylib, parser) // expands to: namespace mylib { namespace parser {
GMP_GENERATE_NAMESPACES_END(mylib, parser) // expands to: } }

为什么选择 GMP?

Header-only、零运行时开销,可在编译期生成成千上万行代码。