{"id":15047412,"url":"https://github.com/spite-triangle/variant","last_synced_at":"2026-02-10T21:33:23.983Z","repository":{"id":215752958,"uuid":"739617006","full_name":"spite-triangle/variant","owner":"spite-triangle","description":"It's a  variant component, based on C++11.","archived":false,"fork":false,"pushed_at":"2024-01-13T02:06:12.000Z","size":68,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-07T03:41:01.703Z","etag":null,"topics":["cpp","cpp11","variant"],"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/spite-triangle.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":"2024-01-06T02:47:12.000Z","updated_at":"2025-03-26T06:48:18.000Z","dependencies_parsed_at":"2024-01-06T10:33:04.947Z","dependency_job_id":"a4d966f0-3074-4728-bc0f-6a1ddb6849b4","html_url":"https://github.com/spite-triangle/variant","commit_stats":null,"previous_names":["spite-triangle/variant"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/spite-triangle/variant","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spite-triangle%2Fvariant","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spite-triangle%2Fvariant/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spite-triangle%2Fvariant/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spite-triangle%2Fvariant/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/spite-triangle","download_url":"https://codeload.github.com/spite-triangle/variant/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spite-triangle%2Fvariant/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29317956,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-10T20:44:44.282Z","status":"ssl_error","status_checked_at":"2026-02-10T20:44:43.393Z","response_time":65,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["cpp","cpp11","variant"],"created_at":"2024-09-24T20:57:59.158Z","updated_at":"2026-02-10T21:33:23.960Z","avatar_url":"https://github.com/spite-triangle.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 介绍\n\n提供类似 `std::variant` 功能的组件，基于 `c++11` 基础语法实现，适用于 `c++11` 及以上版本。使用该组件只需包含头文件 `src/Variant.hpp` 即可。\n\n# 设计思路\n\n参考：\n\n- [用c++11打造好用的variant](https://www.cnblogs.com/qicosmos/p/3416432.html)\n\n\n# 使用\n\n## 基本用法\n\n```cpp\n#include \"Variant.hpp\"\n\n// 定义，可以传参 std::string, int , double, bool\nusing Variant = OwO::Variant\u003cstd::string, int , double, bool\u003e;\n\nint main(){\n    // std::string, int , double, bool 赋值\n    Variant var;\n    Variant var1;\n    var = 1; // 直接赋值\n    var1 = var; // Variant 之间进行赋值\n\n    // 获取变量\n    var =  12.1;\n    printf(\"获取类型, %f\\n\", var.Get\u003cbool\u003e());\n    var =  \"teste\";\n    printf(\"获取类型, %s\\n\", var.Get\u003cstd::string\u003e().c_str());\n\n    // 类型判断\n    bool bFlag = var.Is\u003cbool\u003e();\n\n    // 变量是否有效\n    bFlag = var.Vaild();\n}\n```\n\n**不建议直接在 `OwO::Variant` 中放入指针，建议使用 `std::shared_ptr` 替代**。\n\n## 数据格式\n\n能够使用 `OwO::Variant` 进行存储的数据类型需要满足以下条件：\n- 无参构造\n- 拷贝构造\n- 析构函数\n- 上述成员函数必须为 `public` 修饰\n\n```cpp\nstruct Test{\npublic:\n    Test() = default; // 无参构造\n    Test(const Test \u0026) = default; // 拷贝构造\n    ~Test() = default; // 析构\n};\n```\n\n## 字符串格式化\n\n```cpp\n    Variant var;\n\n    // 字符串格式化\n    var = false;\n    printf(\"变量字符串输出, %s\\n\", var.String().c_str());\n```\n\n组件默认支持的类型有 `bool` 、`int` 、`float` 、`double` 、`std::string` 、`size_t` 、`int64_t`。其余数据类型需要自定义输出格式\n\n\n```cpp\nstruct Test{\n    int a = -1;\n};\n\nint main(){\n    /* 子定义类型输出 */\n    Variant::RegisterFormatString(typeid(Test), [](const void * pData){\n        const Test * t = (const Test*) pData;\n        return OwO::Format(\"a: %d\", t-\u003ea);\n    });\n\n    Test t;\n    Variant var = t;\n    printf(\"Test: %s\\n\", var.String().c_str());\n}\n```\n\n## 运算\n\n`OwO::Variant` 支持的运算符号有：`+`、`-`、`/` 、`*`、`\u003c`、`\u003e`、`\u003c=`、`\u003e=`、`==`、`!=` \n\n```cpp\n    Variant var1;\n    Variant var2;\n\n    var1 = 4;\n    var2 = var1 + 10;\n\n    int res = var1 + var2;\n```\n\n对于自定义数据结构化需要重写对应的运算符，否则四则运算结果为默认对象，布尔运算返回结果为 `false`。\n\n```cpp\nstruct Test{\n    Test operator+(const Test \u0026 other) const\n    {\n        Test tmp;\n        tmp.a = a + other.a;\n        return tmp;\n    }\n\n    int a = -1;\n};\n\nusing Variant = OwO::Variant\u003cstring, int , double, Test\u003e;\n\nint main(){\n    Variant var1;\n    Variant var2;\n\n    Test a1;\n    a1.a = 11;\n    Test a2;\n    a2.a = 22;\n\n    var1 = a1;\n    var2 = a2;\n\n    auto resAdd = var1 + var2;\n    auto resMinus = var1 - var2; // Test::a 的结果为 -1，因为 Test 没有定义 operator-\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspite-triangle%2Fvariant","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fspite-triangle%2Fvariant","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspite-triangle%2Fvariant/lists"}