{"id":15047316,"url":"https://github.com/oktonion/cppmeta","last_synced_at":"2026-04-01T17:16:59.061Z","repository":{"id":49817150,"uuid":"505323726","full_name":"oktonion/cppmeta","owner":"oktonion","description":"one header tiny C++ type meta-information library for reflection and serialization","archived":false,"fork":false,"pushed_at":"2025-01-05T00:12:37.000Z","size":213,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-29T19:23:01.266Z","etag":null,"topics":["cpp03","cpp98","header-only","library","metainformation","reflection","serialization","single-header"],"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/oktonion.png","metadata":{"files":{"readme":"README.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}},"created_at":"2022-06-20T06:40:31.000Z","updated_at":"2022-06-20T08:05:40.000Z","dependencies_parsed_at":"2024-06-14T08:48:56.860Z","dependency_job_id":"8b2fc774-84a4-4ef2-9f8b-1a43f74952c4","html_url":"https://github.com/oktonion/cppmeta","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/oktonion/cppmeta","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oktonion%2Fcppmeta","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oktonion%2Fcppmeta/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oktonion%2Fcppmeta/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oktonion%2Fcppmeta/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oktonion","download_url":"https://codeload.github.com/oktonion/cppmeta/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oktonion%2Fcppmeta/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31018544,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-27T03:51:26.850Z","status":"ssl_error","status_checked_at":"2026-03-27T03:51:09.693Z","response_time":164,"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":["cpp03","cpp98","header-only","library","metainformation","reflection","serialization","single-header"],"created_at":"2024-09-24T20:56:34.411Z","updated_at":"2026-03-27T04:03:28.134Z","avatar_url":"https://github.com/oktonion.png","language":"C++","readme":"# cppmeta\none header tiny C++ type meta-information library for reflection and serialization for classes, functions, types\n\n- single header\n- no external dependencies except for small set of C++98 std library headers\n- terms used for registering and retrieving meta-information are standard complient\n\n----------\n\nUsage examples\n----------\n\n## Compile-time reflection\n\n### Manual registration\n```cpp\n#include \u003ccppmeta.hpp\u003e\n\nstruct type_for_ct_reflection\n{\n    type_for_ct_reflection() {}\n    type_for_ct_reflection(int, float) {}\n    type_for_ct_reflection(int, int) {}\n\n    int data1;\n\n    void func1(float) {}\n\n    template\u003cclass T\u003e\n    void templ_func1(T) {}\n};\n\ntemplate\u003c\u003e\nstruct cppmeta::reflect\u003ctype_for_ct_reflection, cppmeta::reflection::compile_time\u003e\n{\n    template\u003cclass meta_info\u003e\n    void operator()() const\n    {\n        cppmeta::reflect\u003ctype_for_ct_reflection\u003e::\n            name = \"type_for_ct_reflection\",\n            members = \n                member(\"type_for_ct_reflection()\", \u0026class_\u003ctype_for_ct_reflection\u003e::default_constructor),\n                member(\"type_for_ct_reflection(int, float)\", \u0026class_\u003ctype_for_ct_reflection\u003e::constructor\u003cint, float\u003e),\n                member(\"constructor2\", \u0026class_\u003ctype_for_ct_reflection\u003e::constructor\u003cint, int\u003e),\n                member(\"~type_for_ct_reflection\", \u0026class_\u003ctype_for_ct_reflection\u003e::destructor),\n                member(\"data1\", \u0026type_for_ct_reflection::data1),\n                member(\"func1\", \u0026type_for_ct_reflection::func1),\n                member(\"templ_func1(int)\", \u0026type_for_ct_reflection::templ_func1\u003cint\u003e)\n            ;\n    }\n};\n\nint some_data_ct;\n\ntemplate\u003c\u003e\nstruct cppmeta::reflect_ct\u003cint\u003e\n{\n    template\u003cclass meta_info\u003e\n    void operator()() const\n    {\n        meta_info::\n            objects += \n                object(\"some_data_ct\", \u0026some_data_ct);\n            ;\n    }\n};\n```\n\n### Class member pointer resolve\n```cpp\nusing namespace cppmeta;\nint type_for_ct_reflection::* data1_tmp =\n    resolve\u003ctype_for_ct_reflection\u003e::member\u003cint\u003e(\"data1\").value;\ntype_for_ct_reflection obj;\nobj.data1 == obj.*data1_tmp; // true\n```\n\n## Runtime reflection\n\n### Manual registration\n```cpp\n#include \u003ccppmeta.hpp\u003e\n\nstruct type_for_rt_reflection\n{\n    type_for_rt_reflection() {}\n    type_for_rt_reflection(int, float) {}\n    type_for_rt_reflection(int, int) {}\n\n    int data1;\n\n    void func1(float) {}\n\n    template\u003cclass T\u003e\n    void templ_func1(T) {}\n};\n\nstruct type_for_rt_reflection_child\n    : type_for_rt_reflection \n{\n    int data2;\n};\n\nint some_data_rt = 0;\nconst int some_data_rt_const = 0;\n\nenum enum_for_rt_reflection\n{\n    rt_1,\n    rt_2\n};\n\nvoid MyCode()\n{\n    using namespace cppmeta;\n\n    reflect\u003ctype_for_rt_reflection\u003e::\n        name = \"type_for_rt_reflection\",\n        members = \n             member(\"type_for_rt_reflection()\", \u0026class_\u003ctype_for_rt_reflection\u003e::default_constructor)\n            ,member(\"data1\", \u0026type_for_rt_reflection::data1)\n        ;\n\n    reflect\u003ctype_for_rt_reflection_child\u003e::\n        name = \"type_for_rt_reflection_child\",\n        members =\n              member(\"type_for_rt_reflection_child()\", \u0026class_\u003ctype_for_rt_reflection_child\u003e::default_constructor)\n            , member(\"data2\", \u0026type_for_rt_reflection_child::data2)\n            , reflect\u003ctype_for_rt_reflection\u003e::members // add parent members to child (optional)\n        ;\n\n    reflect\u003cint\u003e::\n        objects += \n              object(\"some_data_rt\", \u0026some_data_rt)\n            , object(\"some_data_rt_ref\", some_data_rt)\n            , object(\"some_data_rt_const\", some_data_rt_const)\n        ,values +=\n            constant(\"max_int\", 2048)\n        ;\n\n    reflect\u003cenum_for_rt_reflection\u003e::\n            name = \"enum_for_rt_reflection\",\n            values = \n                constant(\"rt_1\", rt_1),\n                constant(\"rt_2\", rt_2)\n            ;\n}\n\n```\n### Class member pointer resolve\n```cpp\nint type_for_rt_reflection::*  data1_tmp =\n    resolve\u003ctype_for_rt_reflection\u003e::member\u003cint\u003e(\"data1\").value;\n\ntype_for_rt_reflection obj;\nobj.data1 == obj.*data1_tmp; // true\n\nint type_for_rt_reflection_child::* child_data1_tmp = \n    resolve\u003ctype_for_rt_reflection_child\u003e::member\u003cint\u003e(\"data1\").value;\n\ntype_for_rt_reflection_child obj_child;\nobj_child.data1 == obj_child.*child_data1_tmp; // true\n```\n\n### Object by value resolve\n```cpp\nint some_data_rt_resolved =\n    resolve\u003cint\u003e::object(\"some_data_rt\").value;\nconst int\u0026 some_data_rt_resolved =\n    resolve\u003cint\u003e::object(\"some_data_rt_const\").value;\n```\n\n### Object by const value resolve\n```cpp\nconst int\u0026 some_data_rt_const_resolved =\n    resolve\u003cconst int\u003e::object(\"some_data_rt\").value;\nconst int\u0026 some_data_rt_const_resolved =\n    resolve\u003cconst int\u003e::object(\"some_data_rt_const\").value;\n```\n### Object by reference resolve\n```cpp\nint\u0026 some_data_rt_ref_resolved =\n    resolve\u003cint\u0026\u003e::object(\"some_data_rt\").value;\nsome_data_rt_ref_resolved = 42; // changes `some_data_rt`\nconst int\u0026 some_data_rt_ref_const_resolved =\n    resolve\u003cconst int\u0026\u003e::object(\"some_data_rt_const\").value;\n```\n\n### Object by pointer resolve\n```cpp\nint* some_data_rt_ptr_resolved =\n    resolve\u003cint*\u003e::object(\"some_data_rt\").value;\n(*some_data_rt_ref_resolved) = 42; // changes `some_data_rt`\nconst int* some_data_rt_ptr_const_resolved =\n    resolve\u003cconst int*\u003e::object(\"some_data_rt_const\").value;\n```\n\n### Const value resolve\n```cpp\nconst int\u0026 max_int_const =\n    resolve\u003cconst int\u003e::constant(\"max_int\").value;\n```\n\n### Enum values resolve\n```cpp\nconst enum_for_rt_reflection\u0026 rt_1_const =\n    resolve\u003cenum_for_rt_reflection\u003e::value(\"rt_1\").value;\n```\n\n### Invoke functions\n```cpp\n// in progress\n```","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foktonion%2Fcppmeta","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foktonion%2Fcppmeta","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foktonion%2Fcppmeta/lists"}