6868
6969 </ head >
7070 < body >
71- < header data-kunai-mdinfo ="{"meta": {"header": ["variant"], "namespace": ["std"], "id-type": ["class template"], "cpp": ["cpp17"]}, "sources": [{"id": "3b47c816ac6bb87d13aeb5f8ce7fe81e0ebcf57d", "source": "#include <iostream>\n#include <variant>\n#include <string>\n\nint main()\n{\n // int, char, std::string\u306e\u3044\u305a\u308c\u304b\u306e\u578b\u306e\u5024\u3092\u4fdd\u6301\u3067\u304d\u308b\u578b\n std::variant<int, char, std::string> v = 3; // int\u578b\u306e\u5024\u3092\u4ee3\u5165\n\n // \u5019\u88dc\u578b\u306e0\u756a\u76ee\u306e\u578b (int) \u3092\u4fdd\u6301\u3057\u3066\u3044\u308b\u304b\n if (v.index() == 0) {\n int& x = std::get<0>(v); // \u578b\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u6307\u5b9a\u3057\u3066\u3001\u4fdd\u6301\u3057\u3066\u3044\u308b\u5024\u3092\u53d6\u5f97\n std::cout << x << std::endl;\n }\n\n v = std::string(\"Hello\"); // std::string\u578b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u4ee3\u5165\n\n // std::string\u578b\u3092\u4fdd\u6301\u3057\u3066\u3044\u308b\u304b\n if (std::holds_alternative<std::string>(v)) {\n std::string& x = std::get<std::string>(v); // \u578b\u3092\u6307\u5b9a\u3057\u3066\u3001\u4fdd\u6301\u3057\u3066\u3044\u308b\u5024\u3092\u53d6\u5f97\n std::cout << x << std::endl;\n }\n}\n"}], "page_id": ["reference", "variant", "variant"]} ">
71+ < header data-kunai-mdinfo ="{"meta": {"header": ["variant"], "namespace": ["std"], "id-type": ["class template"], "cpp": ["cpp17"]}, "sources": [{"id": "3b47c816ac6bb87d13aeb5f8ce7fe81e0ebcf57d", "source": "#include <iostream>\n#include <variant>\n#include <string>\n\nint main()\n{\n // int, char, std::string\u306e\u3044\u305a\u308c\u304b\u306e\u578b\u306e\u5024\u3092\u4fdd\u6301\u3067\u304d\u308b\u578b\n std::variant<int, char, std::string> v = 3; // int\u578b\u306e\u5024\u3092\u4ee3\u5165\n\n // \u5019\u88dc\u578b\u306e0\u756a\u76ee\u306e\u578b (int) \u3092\u4fdd\u6301\u3057\u3066\u3044\u308b\u304b\n if (v.index() == 0) {\n int& x = std::get<0>(v); // \u578b\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u6307\u5b9a\u3057\u3066\u3001\u4fdd\u6301\u3057\u3066\u3044\u308b\u5024\u3092\u53d6\u5f97\n std::cout << x << std::endl;\n }\n\n v = std::string(\"Hello\"); // std::string\u578b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u4ee3\u5165\n\n // std::string\u578b\u3092\u4fdd\u6301\u3057\u3066\u3044\u308b\u304b\n if (std::holds_alternative<std::string>(v)) {\n std::string& x = std::get<std::string>(v); // \u578b\u3092\u6307\u5b9a\u3057\u3066\u3001\u4fdd\u6301\u3057\u3066\u3044\u308b\u5024\u3092\u53d6\u5f97\n std::cout << x << std::endl;\n }\n}\n"}, {"id": "4ac7c00fd45ad81619e340a74863eafb82c72340", "source": "#include <iostream>\n#include <variant>\n#include <string>\n\n// variant\u3092\u7d99\u627f\u3057\u3001\u72ec\u81ea\u306e\u64cd\u4f5c\u3092\u8ffd\u52a0\u3059\u308b\nstruct Value : std::variant<int, std::string> {\n using variant::variant;\n\n bool is_string() const\n {\n return std::holds_alternative<std::string>(*this);\n }\n};\n\nint main()\n{\n Value v = std::string(\"Hello\");\n\n std::cout << std::boolalpha << v.is_string() << std::endl;\n\n // C++23\u304b\u3089\u3001\u7d99\u627f\u3057\u305f\u578b\u3082std::visit()\u306b\u6e21\u305b\u308b\n std::visit([](const auto& x) { std::cout << x << std::endl; }, v);\n}\n"}], "page_id": ["reference", "variant", "variant"]} ">
7272 < nav class ="navbar navbar-default " role ="navigation ">
7373 < div class ="container-fluid ">
7474 < div class ="navbar-header ">
189189 < p class ="text-right "> < small >
190190 最終更新日時:
191191 < time itemprop ="datePublished " class ="js-local-time "
192- datetime ="2026-08-24T23:57:44 +09:00 ">
193- 2026年08月24日 23時57分44秒 (JST)
192+ datetime ="2026-08-31T12:27:20 +09:00 ">
193+ 2026年08月31日 12時27分20秒 (JST)
194194 </ time >
195195 < br />
196196 < span itemprop ="author " itemscope itemtype ="http://schema.org/Person ">
@@ -510,6 +510,7 @@ <h2>ハッシュサポート</h2>
510510</ tbody >
511511</ table >
512512< h2 > 例</ h2 >
513+ < h3 > 基本的な使い方</ h3 >
513514< p > < div class ="yata " id ="3b47c816ac6bb87d13aeb5f8ce7fe81e0ebcf57d "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include < a href ="../iostream.html "> <iostream></ a > </ span >
514515< span class ="cp "> #include < a href ="../variant.html "> <variant></ a > </ span >
515516< span class ="cp "> #include < a href ="../string.html "> <string></ a > </ span >
@@ -535,10 +536,40 @@ <h2>例</h2>
535536< span class ="p "> }</ span >
536537</ code > </ pre > </ div >
537538</ div > </ p >
538- < h3 > 出力</ h3 >
539+ < h4 > 出力</ h4 >
539540< p > < pre > < code > 3
540541Hello
541542</ code > </ pre > </ p >
543+ < h3 > < code > variant</ code > を継承して操作を追加する (C++23)</ h3 >
544+ < p > < div class ="yata " id ="4ac7c00fd45ad81619e340a74863eafb82c72340 "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include < a href ="../iostream.html "> <iostream></ a > </ span >
545+ < span class ="cp "> #include < a href ="../variant.html "> <variant></ a > </ span >
546+ < span class ="cp "> #include < a href ="../string.html "> <string></ a > </ span >
547+
548+ < span class ="c1 "> // variantを継承し、独自の操作を追加する</ span >
549+ < span class ="k "> struct</ span > < span class ="w "> </ span > < span class ="nc "> Value</ span > < span class ="w "> </ span > < span class ="o "> :</ span > < span class ="w "> </ span > < span class ="n "> < a href =""> std::variant</ a > </ span > < span class ="o "> <</ span > < span class ="kt "> int</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> < a href ="../string/basic_string.html "> std::string</ a > </ span > < span class ="o "> ></ span > < span class ="w "> </ span > < span class ="p "> {</ span >
550+ < span class ="w "> </ span > < span class ="k "> using</ span > < span class ="w "> </ span > < span class ="n "> variant</ span > < span class ="o "> ::</ span > < span class ="n "> variant</ span > < span class ="p "> ;</ span >
551+
552+ < span class ="w "> </ span > < span class ="kt "> bool</ span > < span class ="w "> </ span > < span class ="nf "> is_string</ span > < span class ="p "> ()</ span > < span class ="w "> </ span > < span class ="k "> const</ span >
553+ < span class ="w "> </ span > < span class ="p "> {</ span >
554+ < span class ="w "> </ span > < span class ="k "> return</ span > < span class ="w "> </ span > < span class ="n "> < a href ="holds_alternative.html "> std::holds_alternative</ a > </ span > < span class ="o "> <</ span > < span class ="n "> < a href ="../string/basic_string.html "> std::string</ a > </ span > < span class ="o "> ></ span > < span class ="p "> (</ span > < span class ="o "> *</ span > < span class ="k "> this</ span > < span class ="p "> );</ span >
555+ < span class ="w "> </ span > < span class ="p "> }</ span >
556+ < span class ="p "> };</ span >
557+
558+ < span class ="kt "> int</ span > < span class ="w "> </ span > < span class ="nf "> main</ span > < span class ="p "> ()</ span >
559+ < span class ="p "> {</ span >
560+ < span class ="w "> </ span > < span class ="n "> Value</ span > < span class ="w "> </ span > < span class ="n "> v</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="n "> < a href ="../string/basic_string.html "> std::string</ a > </ span > < span class ="p "> (</ span > < span class ="s "> "Hello"</ span > < span class ="p "> );</ span >
561+
562+ < span class ="w "> </ span > < span class ="n "> < a href ="../iostream/cout.html "> std::cout</ a > </ span > < span class ="w "> </ span > < span class ="o "> <<</ span > < span class ="w "> </ span > < span class ="n "> < a href ="../ios/boolalpha.html "> std::boolalpha</ a > </ span > < span class ="w "> </ span > < span class ="o "> <<</ span > < span class ="w "> </ span > < span class ="n "> v</ span > < span class ="p "> .</ span > < span class ="n "> is_string</ span > < span class ="p "> ()</ span > < span class ="w "> </ span > < span class ="o "> <<</ span > < span class ="w "> </ span > < span class ="n "> < a href ="../ostream/endl.html "> std::endl</ a > </ span > < span class ="p "> ;</ span >
563+
564+ < span class ="w "> </ span > < span class ="c1 "> // C++23から、継承した型も< a href ="visit.html "> std::visit</ a > ()に渡せる</ span >
565+ < span class ="w "> </ span > < span class ="n "> < a href ="visit.html "> std::visit</ a > </ span > < span class ="p "> ([](</ span > < span class ="k "> const</ span > < span class ="w "> </ span > < span class ="k "> auto</ span > < span class ="o "> &</ span > < span class ="w "> </ span > < span class ="n "> x</ span > < span class ="p "> )</ span > < span class ="w "> </ span > < span class ="p "> {</ span > < span class ="w "> </ span > < span class ="n "> < a href ="../iostream/cout.html "> std::cout</ a > </ span > < span class ="w "> </ span > < span class ="o "> <<</ span > < span class ="w "> </ span > < span class ="n "> x</ span > < span class ="w "> </ span > < span class ="o "> <<</ span > < span class ="w "> </ span > < span class ="n "> < a href ="../ostream/endl.html "> std::endl</ a > </ span > < span class ="p "> ;</ span > < span class ="w "> </ span > < span class ="p "> },</ span > < span class ="w "> </ span > < span class ="n "> v</ span > < span class ="p "> );</ span >
566+ < span class ="p "> }</ span >
567+ </ code > </ pre > </ div >
568+ </ div > </ p >
569+ < h4 > 出力</ h4 >
570+ < p > < pre > < code > true
571+ Hello
572+ </ code > </ pre > </ p >
542573< h2 > バージョン</ h2 >
543574< h3 > 言語</ h3 >
544575< ul >
@@ -573,6 +604,10 @@ <h2>参照</h2>
573604< li > < a href ="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0110r0.html " target ="_blank "> P0110R0 Implementing the strong guarantee for < code > variant<></ code > assignment</ a > </ li >
574605< li > < a href ="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0308r0.html " target ="_blank "> P0308R0 Valueless Variants Considered Harmful</ a > </ li >
575606< li > < a href ="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0510r0.html " target ="_blank "> P0510R0 Disallowing references, incomplete types, arrays, and empty variants</ a > </ li >
607+ < li > < a href ="https://open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2162r2.html " target ="_blank "> P2162R2 Inheriting from < code > std::variant</ code > </ a > < ul >
608+ < li > C++23で、< code > variant</ code > をpublic継承した型も< code > < a href ="visit.html "> std::visit()</ a > </ code > に渡せるようになった</ li >
609+ </ ul >
610+ </ li >
576611< li > < a href ="https://cplusplus.github.io/LWG/issue2901 " target ="_blank "> LWG Issue 2901. < code > variant</ code > s cannot properly support allocators</ a > < ul >
577612< li > C++17の策定中に、アロケータ対応のコンストラクタと< code > uses_allocator</ code > の特殊化が削除された(公開されたC++17にはこれらは存在しない)。< code > variant</ code > は後続の値の代入で構築時のアロケータが失われるため、適切なアロケータ対応ができないという理由による</ li >
578613</ ul >
0 commit comments