Skip to content

Commit 8d0b1e7

Browse files
author
cpprefjp-autoupdate
committed
update automatically
1 parent d9a80e1 commit 8d0b1e7

File tree

5 files changed

+8198
-9061
lines changed

5 files changed

+8198
-9061
lines changed

lang/cpp20/class_types_in_non-type_template_parameters.html

Lines changed: 67 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868

6969
</head>
7070
<body>
71-
<header data-kunai-mdinfo="{&#34;meta&#34;: {&#34;cpp&#34;: [&#34;cpp20&#34;]}, &#34;sources&#34;: [{&#34;id&#34;: &#34;e5a53f49e09225208d942a08e86161f07d9ea1d5&#34;, &#34;source&#34;: &#34;#include &lt;utility&gt;\n\nstruct X1 {\n int i;\n float f;\n\n friend bool operator==(const X1&amp;, const X1&amp;) = 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&amp;, const X2&amp;) = default;\n};\n\ntemplate &lt;int N&gt;\nstruct C1 {\n static constexpr int value = N;\n};\n\ntemplate &lt;float N&gt;\nstruct C2 {\n static constexpr float value = N;\n};\n\ntemplate &lt;X1 x1, X2 x2&gt;\nstruct C3 {\n static constexpr X1 value1 = x1;\n static constexpr X2 value2 = x2;\n};\n\ntemplate &lt;auto V&gt;\nstruct C4 {\n static constexpr decltype(V) value = V;\n};\n\nint main() {\n static_assert(C1&lt;1&gt;::value == 1);\n static_assert(C2&lt;3.14f&gt;::value == 3.14f);\n\n constexpr X1 x1{1, 3.14f};\n constexpr X2 x2{2, 5.27f};\n using c3 = C3&lt;x1, x2&gt;;\n static_assert(c3::value1 == x1);\n static_assert(c3::value2 == x2);\n\n static_assert(C4&lt;1&gt;::value == 1);\n static_assert(C4&lt;3.14f&gt;::value == 3.14f);\n static_assert(C4&lt;x1&gt;::value == x1);\n static_assert(C4&lt;x2&gt;::value == x2);\n\n constexpr std::pair p{1, 3.14};\n static_assert(C4&lt;p&gt;::value == p);\n}\n&#34;}], &#34;page_id&#34;: [&#34;lang&#34;, &#34;cpp20&#34;, &#34;class_types_in_non-type_template_parameters&#34;]}">
71+
<header data-kunai-mdinfo="{&#34;meta&#34;: {&#34;cpp&#34;: [&#34;cpp20&#34;]}, &#34;sources&#34;: [{&#34;id&#34;: &#34;e5a53f49e09225208d942a08e86161f07d9ea1d5&#34;, &#34;source&#34;: &#34;#include &lt;utility&gt;\n\nstruct X1 {\n int i;\n float f;\n\n friend bool operator==(const X1&amp;, const X1&amp;) = 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&amp;, const X2&amp;) = default;\n};\n\ntemplate &lt;int N&gt;\nstruct C1 {\n static constexpr int value = N;\n};\n\ntemplate &lt;float N&gt;\nstruct C2 {\n static constexpr float value = N;\n};\n\ntemplate &lt;X1 x1, X2 x2&gt;\nstruct C3 {\n static constexpr X1 value1 = x1;\n static constexpr X2 value2 = x2;\n};\n\ntemplate &lt;auto V&gt;\nstruct C4 {\n static constexpr decltype(V) value = V;\n};\n\nint main() {\n static_assert(C1&lt;1&gt;::value == 1);\n static_assert(C2&lt;3.14f&gt;::value == 3.14f);\n\n constexpr X1 x1{1, 3.14f};\n constexpr X2 x2{2, 5.27f};\n using c3 = C3&lt;x1, x2&gt;;\n static_assert(c3::value1 == x1);\n static_assert(c3::value2 == x2);\n\n static_assert(C4&lt;1&gt;::value == 1);\n static_assert(C4&lt;3.14f&gt;::value == 3.14f);\n static_assert(C4&lt;x1&gt;::value == x1);\n static_assert(C4&lt;x2&gt;::value == x2);\n\n constexpr std::pair p{1, 3.14};\n static_assert(C4&lt;p&gt;::value == p);\n}\n&#34;}, {&#34;id&#34;: &#34;1d9031c3bf641936357833df4f876fefb95c95ed&#34;, &#34;source&#34;: &#34;#include &lt;iostream&gt;\n\ntemplate &lt;class T&gt;\nstruct X {\n constexpr X(T x) : value(x) {}\n T value;\n};\n\ntemplate &lt;X x&gt;\nstruct Y {\n void print() {\n std::cout &lt;&lt; x.value &lt;&lt; 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&lt;3&gt;{}.print();\n}\n&#34;}, {&#34;id&#34;: &#34;eeddf8b1a50c884ff36cb899b11f663da9829bdc&#34;, &#34;source&#34;: &#34;#include &lt;iostream&gt;\n#include &lt;algorithm&gt;\n\ntemplate &lt;typename CharT, std::size_t N&gt;\nstruct basic_fixed_string {\n constexpr basic_fixed_string(const CharT (&amp;str)[N+1])\n { std::copy_n(str, N+1, data); }\n\n friend auto operator&lt;=&gt;(const basic_fixed_string&amp;, const basic_fixed_string&amp;) = default;\n CharT data[N+1];\n};\n\ntemplate &lt;typename CharT, std::size_t N&gt;\nbasic_fixed_string(const CharT (&amp;str)[N]) -&gt; basic_fixed_string&lt;CharT, N-1&gt;;\n\ntemplate &lt;std::size_t N&gt;\nusing fixed_string = basic_fixed_string&lt;char, N&gt;;\n\nnamespace my_literals {\ntemplate &lt;basic_fixed_string str&gt;\nauto operator\&#34;\&#34;_udl() {\n return str;\n}\n}\n\nint main() {\n using namespace my_literals;\n auto s = \&#34;hello\&#34;_udl;\n std::cout &lt;&lt; s.data &lt;&lt; std::endl;\n}\n&#34;}], &#34;page_id&#34;: [&#34;lang&#34;, &#34;cpp20&#34;, &#34;class_types_in_non-type_template_parameters&#34;]}">
7272
<nav class="navbar navbar-default" role="navigation">
7373
<div class="container-fluid">
7474
<div class="navbar-header">
@@ -188,8 +188,8 @@
188188

189189
<p class="text-right"><small>
190190
最終更新日時(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秒
193193
</span>
194194
<br/>
195195
<span itemprop="author" itemscope itemtype="http://schema.org/Person">
@@ -251,6 +251,7 @@ <h2>備考</h2>
251251
</li>
252252
</ul>
253253
<h2></h2>
254+
<h3>floatやクラス型を非型テンプレートパラメータにする例</h3>
254255
<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">&lt;utility&gt;</a></span><span class="cp"></span>
255256

256257
<span class="k">struct</span> <span class="n">X1</span> <span class="p">{</span>
@@ -311,8 +312,70 @@ <h2>例</h2>
311312
<span class="p">}</span>
312313
</code></pre></div>
313314
</div></p>
314-
<h3>出力</h3>
315+
<h4>出力</h4>
315316
<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">&lt;iostream&gt;</a></span><span class="cp"></span>
319+
320+
<span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">T</span><span class="o">&gt;</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">&lt;</span><span class="n">X</span> <span class="n">x</span><span class="o">&gt;</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">&lt;&lt;</span> <span class="n">x</span><span class="p">.</span><span class="n">value</span> <span class="o">&lt;&lt;</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">&lt;</span><span class="mi">3</span><span class="o">&gt;</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">&lt;iostream&gt;</a></span><span class="cp"></span>
345+
<span class="cp">#include</span> <span class="cpf"><a href="../../reference/algorithm.html">&lt;algorithm&gt;</a></span><span class="cp"></span>
346+
347+
<span class="k">template</span> <span class="o">&lt;</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">&gt;</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">&amp;</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">&lt;=&gt;</span><span class="p">(</span><span class="k">const</span> <span class="n">basic_fixed_string</span><span class="o">&amp;</span><span class="p">,</span> <span class="k">const</span> <span class="n">basic_fixed_string</span><span class="o">&amp;</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">&lt;</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">&gt;</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">&amp;</span><span class="n">str</span><span class="p">)[</span><span class="n">N</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">basic_fixed_string</span><span class="o">&lt;</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">&gt;</span><span class="p">;</span>
358+
359+
<span class="k">template</span> <span class="o">&lt;</span><span class="n"><a href="../../reference/cstddef/size_t.html">std::size_t</a></span> <span class="n">N</span><span class="o">&gt;</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">&lt;</span><span class="kt">char</span><span class="p">,</span> <span class="n">N</span><span class="o">&gt;</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">&lt;</span><span class="n">basic_fixed_string</span> <span class="n">str</span><span class="o">&gt;</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">&lt;&lt;</span> <span class="n">s</span><span class="p">.</span><span class="n">data</span> <span class="o">&lt;&lt;</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>
316379
<h2>備考</h2>
317380
<ul>
318381
<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

Comments
 (0)