|
68 | 68 |
|
69 | 69 | </head>
|
70 | 70 | <body>
|
71 |
| -<header data-kunai-mdinfo="{"meta": {"cpp": ["cpp20"]}, "sources": [{"id": "e5a53f49e09225208d942a08e86161f07d9ea1d5", "source": "#include <utility>\n\nstruct X1 {\n int i;\n float f;\n\n friend bool operator==(const X1&, const X1&) = default;\n};\n\nstruct X2 {\n int i;\n float f;\n\n constexpr X2(int i_, float f_)\n : i(i_), f(f_) {}\n\n friend bool operator==(const X2&, const X2&) = default;\n};\n\ntemplate <int N>\nstruct C1 {\n static constexpr int value = N;\n};\n\ntemplate <float N>\nstruct C2 {\n static constexpr float value = N;\n};\n\ntemplate <X1 x1, X2 x2>\nstruct C3 {\n static constexpr X1 value1 = x1;\n static constexpr X2 value2 = x2;\n};\n\ntemplate <auto V>\nstruct C4 {\n static constexpr decltype(V) value = V;\n};\n\nint main() {\n static_assert(C1<1>::value == 1);\n static_assert(C2<3.14f>::value == 3.14f);\n\n constexpr X1 x1{1, 3.14f};\n constexpr X2 x2{2, 5.27f};\n using c3 = C3<x1, x2>;\n static_assert(c3::value1 == x1);\n static_assert(c3::value2 == x2);\n\n static_assert(C4<1>::value == 1);\n static_assert(C4<3.14f>::value == 3.14f);\n static_assert(C4<x1>::value == x1);\n static_assert(C4<x2>::value == x2);\n\n constexpr std::pair p{1, 3.14};\n static_assert(C4<p>::value == p);\n}\n"}], "page_id": ["lang", "cpp20", "class_types_in_non-type_template_parameters"]}"> |
| 71 | +<header data-kunai-mdinfo="{"meta": {"cpp": ["cpp20"]}, "sources": [{"id": "e5a53f49e09225208d942a08e86161f07d9ea1d5", "source": "#include <utility>\n\nstruct X1 {\n int i;\n float f;\n\n friend bool operator==(const X1&, const X1&) = default;\n};\n\nstruct X2 {\n int i;\n float f;\n\n constexpr X2(int i_, float f_)\n : i(i_), f(f_) {}\n\n friend bool operator==(const X2&, const X2&) = default;\n};\n\ntemplate <int N>\nstruct C1 {\n static constexpr int value = N;\n};\n\ntemplate <float N>\nstruct C2 {\n static constexpr float value = N;\n};\n\ntemplate <X1 x1, X2 x2>\nstruct C3 {\n static constexpr X1 value1 = x1;\n static constexpr X2 value2 = x2;\n};\n\ntemplate <auto V>\nstruct C4 {\n static constexpr decltype(V) value = V;\n};\n\nint main() {\n static_assert(C1<1>::value == 1);\n static_assert(C2<3.14f>::value == 3.14f);\n\n constexpr X1 x1{1, 3.14f};\n constexpr X2 x2{2, 5.27f};\n using c3 = C3<x1, x2>;\n static_assert(c3::value1 == x1);\n static_assert(c3::value2 == x2);\n\n static_assert(C4<1>::value == 1);\n static_assert(C4<3.14f>::value == 3.14f);\n static_assert(C4<x1>::value == x1);\n static_assert(C4<x2>::value == x2);\n\n constexpr std::pair p{1, 3.14};\n static_assert(C4<p>::value == p);\n}\n"}, {"id": "1d9031c3bf641936357833df4f876fefb95c95ed", "source": "#include <iostream>\n\ntemplate <class T>\nstruct X {\n constexpr X(T x) : value(x) {}\n T value;\n};\n\ntemplate <X x>\nstruct Y {\n void print() {\n std::cout << x.value << std::endl;\n }\n};\n\nint main() {\n // X\u30af\u30e9\u30b9\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u304c\n // \u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u5f15\u6570`3`\u304b\u3089\u63a8\u8ad6\u3055\u308c\u308b\n Y<3>{}.print();\n}\n"}, {"id": "eeddf8b1a50c884ff36cb899b11f663da9829bdc", "source": "#include <iostream>\n#include <algorithm>\n\ntemplate <typename CharT, std::size_t N>\nstruct basic_fixed_string {\n constexpr basic_fixed_string(const CharT (&str)[N+1])\n { std::copy_n(str, N+1, data); }\n\n friend auto operator<=>(const basic_fixed_string&, const basic_fixed_string&) = default;\n CharT data[N+1];\n};\n\ntemplate <typename CharT, std::size_t N>\nbasic_fixed_string(const CharT (&str)[N]) -> basic_fixed_string<CharT, N-1>;\n\ntemplate <std::size_t N>\nusing fixed_string = basic_fixed_string<char, N>;\n\nnamespace my_literals {\ntemplate <basic_fixed_string str>\nauto operator\"\"_udl() {\n return str;\n}\n}\n\nint main() {\n using namespace my_literals;\n auto s = \"hello\"_udl;\n std::cout << s.data << std::endl;\n}\n"}], "page_id": ["lang", "cpp20", "class_types_in_non-type_template_parameters"]}"> |
72 | 72 | <nav class="navbar navbar-default" role="navigation">
|
73 | 73 | <div class="container-fluid">
|
74 | 74 | <div class="navbar-header">
|
|
188 | 188 |
|
189 | 189 | <p class="text-right"><small>
|
190 | 190 | 最終更新日時(UTC):
|
191 |
| - <span itemprop="datePublished" content="2024-07-08T07:33:21"> |
192 |
| - 2024年07月08日 07時33分21秒 |
| 191 | + <span itemprop="datePublished" content="2025-02-26T08:06:54"> |
| 192 | + 2025年02月26日 08時06分54秒 |
193 | 193 | </span>
|
194 | 194 | <br/>
|
195 | 195 | <span itemprop="author" itemscope itemtype="http://schema.org/Person">
|
@@ -251,6 +251,7 @@ <h2>備考</h2>
|
251 | 251 | </li>
|
252 | 252 | </ul>
|
253 | 253 | <h2>例</h2>
|
| 254 | +<h3>floatやクラス型を非型テンプレートパラメータにする例</h3> |
254 | 255 | <p><div class="yata" id="e5a53f49e09225208d942a08e86161f07d9ea1d5"><div class="codehilite"><pre><span></span><code><span class="cp">#include</span> <span class="cpf"><a href="../../reference/utility.html"><utility></a></span><span class="cp"></span>
|
255 | 256 |
|
256 | 257 | <span class="k">struct</span> <span class="n">X1</span> <span class="p">{</span>
|
@@ -311,8 +312,70 @@ <h2>例</h2>
|
311 | 312 | <span class="p">}</span>
|
312 | 313 | </code></pre></div>
|
313 | 314 | </div></p>
|
314 |
| -<h3>出力</h3> |
| 315 | +<h4>出力</h4> |
315 | 316 | <p><pre><code></code></pre></p>
|
| 317 | +<h3>プレースホルダーを含む型を非型テンプレートパラメータにする例</h3> |
| 318 | +<p><div class="yata" id="1d9031c3bf641936357833df4f876fefb95c95ed"><div class="codehilite"><pre><span></span><code><span class="cp">#include</span> <span class="cpf"><a href="../../reference/iostream.html"><iostream></a></span><span class="cp"></span> |
| 319 | + |
| 320 | +<span class="k">template</span> <span class="o"><</span><span class="k">class</span> <span class="nc">T</span><span class="o">></span> |
| 321 | +<span class="k">struct</span> <span class="n">X</span> <span class="p">{</span> |
| 322 | + <span class="k">constexpr</span> <span class="n">X</span><span class="p">(</span><span class="n">T</span> <span class="n">x</span><span class="p">)</span> <span class="o">:</span> <span class="n">value</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="p">{}</span> |
| 323 | + <span class="n">T</span> <span class="n">value</span><span class="p">;</span> |
| 324 | +<span class="p">};</span> |
| 325 | + |
| 326 | +<span class="k">template</span> <span class="o"><</span><span class="n">X</span> <span class="n">x</span><span class="o">></span> |
| 327 | +<span class="k">struct</span> <span class="n">Y</span> <span class="p">{</span> |
| 328 | + <span class="kt">void</span> <span class="n">print</span><span class="p">()</span> <span class="p">{</span> |
| 329 | + <span class="n"><a href="../../reference/iostream/cout.html">std::cout</a></span> <span class="o"><<</span> <span class="n">x</span><span class="p">.</span><span class="n">value</span> <span class="o"><<</span> <span class="n"><a href="../../reference/ostream/endl.html">std::endl</a></span><span class="p">;</span> |
| 330 | + <span class="p">}</span> |
| 331 | +<span class="p">};</span> |
| 332 | + |
| 333 | +<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> |
| 334 | + <span class="c1">// Xクラステンプレートのテンプレートパラメータが</span> |
| 335 | + <span class="c1">// コンストラクタ引数`3`から推論される</span> |
| 336 | + <span class="n">Y</span><span class="o"><</span><span class="mi">3</span><span class="o">></span><span class="p">{}.</span><span class="n">print</span><span class="p">();</span> |
| 337 | +<span class="p">}</span> |
| 338 | +</code></pre></div> |
| 339 | +</div></p> |
| 340 | +<h4>出力</h4> |
| 341 | +<p><pre><code>3 |
| 342 | +</code></pre></p> |
| 343 | +<h3>文字列クラスオブジェクトを非型テンプレートパラメータにしてリテラル演算子を定義する例</h3> |
| 344 | +<p><div class="yata" id="eeddf8b1a50c884ff36cb899b11f663da9829bdc"><div class="codehilite"><pre><span></span><code><span class="cp">#include</span> <span class="cpf"><a href="../../reference/iostream.html"><iostream></a></span><span class="cp"></span> |
| 345 | +<span class="cp">#include</span> <span class="cpf"><a href="../../reference/algorithm.html"><algorithm></a></span><span class="cp"></span> |
| 346 | + |
| 347 | +<span class="k">template</span> <span class="o"><</span><span class="k">typename</span> <span class="n">CharT</span><span class="p">,</span> <span class="n"><a href="../../reference/cstddef/size_t.html">std::size_t</a></span> <span class="n">N</span><span class="o">></span> |
| 348 | +<span class="k">struct</span> <span class="n">basic_fixed_string</span> <span class="p">{</span> |
| 349 | + <span class="k">constexpr</span> <span class="n">basic_fixed_string</span><span class="p">(</span><span class="k">const</span> <span class="n">CharT</span> <span class="p">(</span><span class="o">&</span><span class="n">str</span><span class="p">)[</span><span class="n">N</span><span class="o">+</span><span class="mi">1</span><span class="p">])</span> |
| 350 | + <span class="p">{</span> <span class="n"><a href="../../reference/algorithm/copy_n.html">std::copy_n</a></span><span class="p">(</span><span class="n">str</span><span class="p">,</span> <span class="n">N</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">data</span><span class="p">);</span> <span class="p">}</span> |
| 351 | + |
| 352 | + <span class="k">friend</span> <span class="k">auto</span> <span class="k">operator</span><span class="o"><=></span><span class="p">(</span><span class="k">const</span> <span class="n">basic_fixed_string</span><span class="o">&</span><span class="p">,</span> <span class="k">const</span> <span class="n">basic_fixed_string</span><span class="o">&</span><span class="p">)</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span> |
| 353 | + <span class="n">CharT</span> <span class="n">data</span><span class="p">[</span><span class="n">N</span><span class="o">+</span><span class="mi">1</span><span class="p">];</span> |
| 354 | +<span class="p">};</span> |
| 355 | + |
| 356 | +<span class="k">template</span> <span class="o"><</span><span class="k">typename</span> <span class="n">CharT</span><span class="p">,</span> <span class="n"><a href="../../reference/cstddef/size_t.html">std::size_t</a></span> <span class="n">N</span><span class="o">></span> |
| 357 | +<span class="n">basic_fixed_string</span><span class="p">(</span><span class="k">const</span> <span class="n">CharT</span> <span class="p">(</span><span class="o">&</span><span class="n">str</span><span class="p">)[</span><span class="n">N</span><span class="p">])</span> <span class="o">-></span> <span class="n">basic_fixed_string</span><span class="o"><</span><span class="n">CharT</span><span class="p">,</span> <span class="n">N</span><span class="o">-</span><span class="mi">1</span><span class="o">></span><span class="p">;</span> |
| 358 | + |
| 359 | +<span class="k">template</span> <span class="o"><</span><span class="n"><a href="../../reference/cstddef/size_t.html">std::size_t</a></span> <span class="n">N</span><span class="o">></span> |
| 360 | +<span class="k">using</span> <span class="n">fixed_string</span> <span class="o">=</span> <span class="n">basic_fixed_string</span><span class="o"><</span><span class="kt">char</span><span class="p">,</span> <span class="n">N</span><span class="o">></span><span class="p">;</span> |
| 361 | + |
| 362 | +<span class="k">namespace</span> <span class="n">my_literals</span> <span class="p">{</span> |
| 363 | +<span class="k">template</span> <span class="o"><</span><span class="n">basic_fixed_string</span> <span class="n">str</span><span class="o">></span> |
| 364 | +<span class="k">auto</span> <span class="k">operator</span><span class="s">""</span><span class="n">_udl</span><span class="p">()</span> <span class="p">{</span> |
| 365 | + <span class="k">return</span> <span class="n">str</span><span class="p">;</span> |
| 366 | +<span class="p">}</span> |
| 367 | +<span class="p">}</span> |
| 368 | + |
| 369 | +<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span> |
| 370 | + <span class="k">using</span> <span class="k">namespace</span> <span class="n">my_literals</span><span class="p">;</span> |
| 371 | + <span class="k">auto</span> <span class="n">s</span> <span class="o">=</span> <span class="s">"hello"</span><span class="n">_udl</span><span class="p">;</span> |
| 372 | + <span class="n"><a href="../../reference/iostream/cout.html">std::cout</a></span> <span class="o"><<</span> <span class="n">s</span><span class="p">.</span><span class="n">data</span> <span class="o"><<</span> <span class="n"><a href="../../reference/ostream/endl.html">std::endl</a></span><span class="p">;</span> |
| 373 | +<span class="p">}</span> |
| 374 | +</code></pre></div> |
| 375 | +</div></p> |
| 376 | +<h4>出力</h4> |
| 377 | +<p><pre><code>hello |
| 378 | +</code></pre></p> |
316 | 379 | <h2>備考</h2>
|
317 | 380 | <ul>
|
318 | 381 | <li><a href="https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97930" target="_blank">Bug 97930 - <code>pair</code> is not a structural type</a><ul>
|
|
0 commit comments