{"id":45471231,"url":"https://github.com/xcrtp/xcmixin","last_synced_at":"2026-04-03T05:04:06.217Z","repository":{"id":338191602,"uuid":"1156946641","full_name":"xcrtp/xcmixin","owner":"xcrtp","description":"xcmixin is a modern C++ static mixin solution base on C++20 that uses CRTP to compose multiple methods into classes at compile time, without modifying the original class definition.","archived":false,"fork":false,"pushed_at":"2026-02-25T07:09:03.000Z","size":69,"stargazers_count":1,"open_issues_count":8,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-25T10:57:14.569Z","etag":null,"topics":["cpluscplus","cplusplus-20","cplusplus-library","cpp-template-programming","cpp20","crtp","ecs","header-only-library","interface","mixin","moderncpp","oop","static-mixin","template-meta-programming","template-programming"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xcrtp.png","metadata":{"files":{"readme":"README-zh.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-13T08:39:42.000Z","updated_at":"2026-02-25T06:18:21.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/xcrtp/xcmixin","commit_stats":null,"previous_names":["x-chend-hai/xcmixin","xcrtp/xcmixin"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/xcrtp/xcmixin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xcrtp%2Fxcmixin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xcrtp%2Fxcmixin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xcrtp%2Fxcmixin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xcrtp%2Fxcmixin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xcrtp","download_url":"https://codeload.github.com/xcrtp/xcmixin/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xcrtp%2Fxcmixin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31335195,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-03T04:42:29.251Z","status":"ssl_error","status_checked_at":"2026-04-03T04:42:12.667Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpluscplus","cplusplus-20","cplusplus-library","cpp-template-programming","cpp20","crtp","ecs","header-only-library","interface","mixin","moderncpp","oop","static-mixin","template-meta-programming","template-programming"],"created_at":"2026-02-22T11:27:01.426Z","updated_at":"2026-04-03T05:04:06.211Z","avatar_url":"https://github.com/xcrtp.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# xcmixin\n\n[![GitHub License](https://img.shields.io/github/license/xcrtp/xcmixin)](https://github.com/xcrtp/xcmixin/blob/main/LICENSE)\n[![GitHub Release](https://img.shields.io/github/v/release/xcrtp/xcmixin)](https://github.com/xcrtp/xcmixin/releases)\n[![GitHub Tag](https://img.shields.io/github/v/tag/xcrtp/xcmixin)](https://github.com/xcrtp/xcmixin/tags)\n![GitHub top language](https://img.shields.io/github/languages/top/xcrtp/xcmixin?style=flat)\n\n**xcmixin** 是现代 C++ 的静态混入（Mixin）解决方案，通过 CRTP 模式在编译期将多个方法混入类中，无需修改类的原始定义。\n\n[README](README.md)\n\n## 快速开始\n\n### 构建项目\n\n```bash\n# 配置并构建\ncmake -B build -G Ninja\ncmake --build build\n\n# 运行示例\nbuild/examples/oop_example\n```\n\n### 快速示例\n\n```cpp\n#include \u003ciostream\u003e\n#include \u003cstring\u003e\n#include \"xcmixin/xcmixin.hpp\"\n\nclass MyClass;\nXCMIXIN_IMPL_AVAILABLE(MyClass);\n\n// 1. 定义混入方法\nXCMIXIN_DEF_BEGIN(name_method)\nstd::string name() { return \"Unknown\"; }\nXCMIXIN_DEF_END()\n\nXCMIXIN_DEF_BEGIN(print_method)\nvoid print() { std::cout \u003c\u003c xcmixin_self.name() \u003c\u003c std::endl; }\nXCMIXIN_DEF_END()\n\n// 2. 实现混入（可选：为特定类定制）\nXCMIXIN_IMPL_BEGIN(name_method)\nXCMIXIN_IMPL_FOR(MyClass)\nstd::string name() { return \"MyClass\"; }\nXCMIXIN_IMPL_END()\n\n// 3. 组合混入\nusing recorder = xcmixin::mixin_recorder\u003cprint_method, name_method\u003e;\n\n// 4. 应用到类\nclass MyClass : public xcmixin::impl_recorder\u003cMyClass, recorder\u003e {\n    xcmixin_init_class;\n};\n\nint main() {\n    MyClass obj;\n    obj.print();      // 输出: MyClass\n    obj.name();\n    return 0;\n}\n```\n\n### 组合与注入\n\n通过 `mixin_recorder` 灵活组合多个混入：\n\n```cpp\nusing recorder = xcmixin::mixin_recorder\u003cprint_method, new_name_method,\n                                          dosomethings1_method\u003e;\n```\n\n将组合后的混入注入到目标类：\n\n```cpp\nclass MyClass : public xcmixin::impl_recorder\u003cMyClass, recorder\u003e {\n    xcmixin_init_class;  // 须在类定义末尾调用以进行编译期验证\n};\n```\n\n### 使用方式\n\n与普通成员函数调用方式相同：\n\n```cpp\nMyClass obj;\nobj.print();\nobj.name();\nobj.dosomethings1();\n```\n\n### 泛型约束\n\n使用 `Impl` 概念对模板类型进行约束，作为传统基类引用的替代和增强：\n\n```cpp\ntemplate \u003cxcmixin::Impl\u003cprint_method, name_method\u003e T\u003e\nvoid print(T\u0026 p) {\n    p.print();\n    std::cout \u003c\u003c \"class_name: \" \u003c\u003c p.name() \u003c\u003c std::endl;\n}\n\nint main() {\n    MyClass obj;\n    print(obj);\n    return 0;\n}\n```\n\n与传统的基类引用相比，`Impl` 概念不需要实际的继承关系，只需要派生类包含指定的混入注入，提供更灵活的约束方式。\n\n## 零开销\n\n- **编译期完成**：所有验证均在编译期完成，无运行时开销\n- **单继承链**：生成单继承结构，无多重继承或 vtable 开销\n- **EBO 优化**：无数据成员的混入使用空基类优化，保持标准布局\n\n## 安全\n\n编译期验证确保混入的有效性与正确性：\n\n**类前置声明**\n```cpp\nclass MyClass;\nXCMIXIN_IMPL_AVAILABLE(MyClass); // 所有注入行为须在类定义之前完成\n// ...\nclass MyClass { /* ... */ };\n```\n\n**依赖约束**\n```cpp\nXCMIXIN_REQUIRE(print_method,\n    xcmixin_require_mixin(name_method););\n```\n\n**方法签名验证**\n```cpp\nXCMIXIN_REQUIRE(print_method,\n    xcmixin_require_method(print, void); // 验证 const/volatile/const volatile 重载\n);\n```\n\n**隐藏检测**\n```cpp\nXCMIXIN_REQUIRE(name_method,\n    xcmixin_no_hiding(name, long, int); // 验证 name(int, long) 重载不被隐藏\n    xcmixin_no_hiding(name, int, const_););\n```\n\n## 灵活\n\n### 通用实现\n\n定义可复用的方法集合：\n\n```cpp\nXCMIXIN_DEF_BEGIN(new_name_method)\nstd::string name() { return \"NewName\"; }\nstd::string name() const { return \"NewName\"; }\nXCMIXIN_DEF_END()\n```\n\n### 跨 Mixin 调用\n\n使用 `xcmixin_self` / `xcmixin_const_self` 在任意混入中访问最终派生类的所有方法：\n\n```cpp\nXCMIXIN_DEF_BEGIN(print_method)\nvoid print() {\n    std::cout \u003c\u003c xcmixin_self.name() \u003c\u003c std::endl;\n    std::cout \u003c\u003c xcmixin_self.name(11) \u003c\u003c std::endl;\n    std::cout \u003c\u003c xcmixin_const_self.name(11) \u003c\u003c std::endl;\n}\nXCMIXIN_DEF_END()\n```\n\n### 特化实现\n\n为特定派生类提供定制化的方法实现：\n\n```cpp\nXCMIXIN_IMPL_BEGIN(name_method)\nXCMIXIN_IMPL_FOR(MyClass)\nstd::string name() { return \"MyClass\"; }\nstd::string name(int i) { return \"MyClass \" + std::to_string(i); }\nstd::string name(int i) const { return \"const MyClass \" + std::to_string(i); }\nstd::string name(long i) const { return \"const MyClass \" + std::to_string(i); }\nXCMIXIN_IMPL_END()\n```\n\n### Mixin 扩展\n\n基于已有 Mixin 派生新的 Mixin：\n\n```cpp\nXCMIXIN_DEF_BEGIN(name_method)\nstd::string name() { return \"Unknown\"; }\nXCMIXIN_DEF_END()\n\nXCMIXIN_DEF_EXTEND_BEGIN(new_name_method, name_method)\nusing base::name; // `base` 指向直接基类\nstd::string name() { return \"NewName\"; }\nXCMIXIN_DEF_END()\n```\n\n### 特化扩展\n\n为特定派生类扩展已实现的 Mixin：\n\n```cpp\nXCMIXIN_IMPL_BEGIN(new_name_method)\nXCMIXIN_IMPL_EXTEND_FOR(name_method, MyClass)\nusing base::name;\nstd::string name() { return \"NewName\"; }\nXCMIXIN_IMPL_END()\n```\n\n### 模板类支持\n\nxcmixin 同时支持模板类。使用 `XCMIXIN_PRE_DECL` 前置声明 Mixin，并使用 `xcmixin_init_template` 进行验证：\n\n```cpp\ntemplate \u003ctypename T\u003e\nclass MyTemplate;\nXCMIXIN_PRE_DECL(name_mixin)\nXCMIXIN_REQUIRE(name_mixin, xcmixin_no_hiding(name);)\n\nXCMIXIN_DEF_BEGIN(name_mixin)\nstd::string name() { return \"Unknown\"; }\nXCMIXIN_DEF_END()\n\nXCMIXIN_DEF_BEGIN(sayhello_mixin)\nvoid say_hello() { std::cout \u003c\u003c xcmixin_self.name() \u003c\u003c \" hello \" \u003c\u003c std::endl; }\nXCMIXIN_DEF_END()\n\nusing recorder = xcmixin::mixin_recorder\u003cname_mixin, sayhello_mixin\u003e;\n\ntemplate \u003ctypename T\u003e\nclass MyTemplate : public xcmixin::impl_recorder\u003cMyTemplate\u003cT\u003e, recorder\u003e {\n    xcmixin_init_template(xcmixin::impl_recorder\u003cMyTemplate\u003cT\u003e, recorder\u003e);\n};\n```\n\n`XCMIXIN_IMPL_BEGIN` 支持扩展参数以声明模板参数，可为不同模板特化提供定制实现：\n\n```cpp\n// 通用模板实现\nXCMIXIN_IMPL_BEGIN(name_mixin, typename T)\nXCMIXIN_IMPL_FOR(MyTemplate\u003cT\u003e)\nstd::string name() { return \"MyTemplate default\"; }\nXCMIXIN_IMPL_END()\n\n// MyTemplate\u003cint\u003e 特化\nXCMIXIN_IMPL_BEGIN(name_mixin)\nXCMIXIN_IMPL_FOR(MyTemplate\u003cint\u003e)\nstd::string name() { return \"MyTemplate\u003cint\u003e\"; }\nXCMIXIN_IMPL_END()\n\n// MyTemplate\u003cfloat\u003e 特化\nXCMIXIN_IMPL_BEGIN(name_mixin)\nXCMIXIN_IMPL_FOR(MyTemplate\u003cfloat\u003e)\nstd::string name() { return \"MyTemplate\u003cfloat\u003e\"; }\nXCMIXIN_IMPL_END()\n\nint main() {\n    MyTemplate\u003cdouble\u003e obj1;\n    obj1.say_hello();  // 输出: MyTemplate default hello\n    MyTemplate\u003cint\u003e obj2;\n    obj2.say_hello();  // 输出: MyTemplate\u003cint\u003e hello\n    MyTemplate\u003cfloat\u003e obj3;\n    obj3.say_hello();  // 输出: MyTemplate\u003cfloat\u003e hello\n}\n```\n\n## 应用场景\n\n- **高性能数学库**：为通用计算提供默认实现，为特定场景提供定制优化\n- **策略模式**：编译期决定策略行为，消除运行时分派开销\n- **状态模式**：编译期状态管理，无运行时状态对象开销\n- **接口组合**：按需组合不同功能模块\n\n## 兼容性\n\n| 编译器 | 支持情况 |\n|--------|----------|\n| clang / clang-cl | 完整支持 |\n| gcc | 完整支持 |\n| MSVC | 部分支持 |\n\n## 已知问题\n\n### MSVC 重载决议缺陷\n\nMSVC 编译器在处理扩展混入宏时存在重载决议缺陷。当使用 `XCMIXIN_DEF_EXTEND_BEGIN` 或 `XCMIXIN_IMPL_EXTEND_FOR` 宏，并通过 `using base::func` 语法引入基类重载函数时，`xcmixin_no_hiding` 检测会在编译期产生误判。\n\n此问题仅影响编译期的有效性验证，不会导致运行时错误。\n\n| 项目 | 说明 |\n|------|------|\n| 受影响编译器 | MSVC |\n| 受影响宏 | `XCMIXIN_DEF_EXTEND_BEGIN` / `XCMIXIN_IMPL_EXTEND_FOR` |\n| 触发条件 | 派生类通过 `using Base::func` 引入基类同名重载函数 |\n| 检测机制 | `xcmixin_no_hiding` 宏 |\n| 影响范围 | 仅编译期类有效性验证阶段 |\n| 运行时行为 | 正常 |\n\n详细说明请参考 [examples/overload-msvc-bug.cc](examples/overload-msvc-bug.cc)。\n\n## 许可证\n\n[MIT License](https://github.com/xcrtp/xcmixin/blob/main/LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxcrtp%2Fxcmixin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxcrtp%2Fxcmixin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxcrtp%2Fxcmixin/lists"}