|
68 | 68 |
|
69 | 69 | </head>
|
70 | 70 | <body>
|
71 |
| -<header data-kunai-mdinfo="{"meta": {"header": ["mdspan"], "namespace": ["std"], "class": ["mdspan"], "cpp": ["cpp23"]}, "sources": [{"id": "b8e69a8545aab969812e17dc16eebb87db90ad26", "source": "#include <cassert>\n#include <array>\n#include <span>\n#include <mdspan>\n#include <type_traits>\n\ntemplate <int N>\nconstexpr auto Int = std::integral_constant<int, N>{};\n\nint main()\n{\n int arr[] = {1, 2, 3, 4, 5, 6};\n\n { // (1) :\u30001\u6b21\u5143\u914d\u5217\u578b\u304b\u3089\u578b\u63a8\u8ad6\n std::mdspan m1{arr};\n static_assert(m1.rank() == 1 && m1.rank_dynamic() == 0);\n static_assert(m1.static_extent(0) == 6);\n // m1 := \u9759\u7684\u8981\u7d20\u6570 6 \u306e1\u6b21\u5143\u914d\u5217\u30d3\u30e5\u30fc\n\n // 2\u6b21\u5143\u914d\u5217\u578b\u304b\u3089\u306f\u578b\u63a8\u8ad6\u3067\u304d\u306a\u3044\n // int arr2d[2][3] = {{1, 2, 3}, {4, 5, 6}};\n // std::mdspan m1_ng{arr2d};\n // \u4e0b\u8a18\u306f\u63a8\u8ad6\u88dc\u52a9(2)\u306b\u3088\u308a0\u6b21\u5143mdspan\u3068\u306a\u308b\n // std::mdspan m1_d0{&arr2d[0][0]};\n }\n { // (2) : \u30dd\u30a4\u30f3\u30bf\u578b\u304b\u3089\u578b\u63a8\u8ad6\n int* ptr = arr;\n std::mdspan m2{ptr};\n static_assert(m2.rank() == 0);\n assert(m2[] == *ptr);\n // m2 := 0\u6b21\u5143\u914d\u5217\u30d3\u30e5\u30fc\n }\n { // (3) : \u8981\u7d20\u6570\u30ea\u30b9\u30c8\u304b\u3089\u578b\u63a8\u8ad6\n std::mdspan m3a{arr, 2, 3};\n static_assert(m3a.rank_dynamic() == 2);\n assert(m3a.size() == 6);\n // m3a := \u52d5\u7684\u8981\u7d20\u6570 2x3 \u306e2\u6b21\u5143\u914d\u5217\u30d3\u30e5\u30fc\n\n std::mdspan m3b{arr, Int<2>, Int<3>};\n static_assert(m3b.rank_dynamic() == 0);\n assert(m3b.size() == 6);\n // m3b := \u9759\u7684\u8981\u7d20\u6570 2x3 \u306e2\u6b21\u5143\u914d\u5217\u30d3\u30e5\u30fc\n }\n { // (4) : \u8981\u7d20\u6570span\u304b\u3089\u578b\u63a8\u8ad6\n int exts[] = {2, 3};\n std::mdspan m4{arr, std::span{exts}};\n static_assert(m4.rank_dynamic() == 2);\n assert(m4.size() == 6);\n // m4 := \u52d5\u7684\u8981\u7d20\u6570 2x3 \u306e2\u6b21\u5143\u914d\u5217\u30d3\u30e5\u30fc\n }\n { // (5) : \u8981\u7d20\u6570array\u304b\u3089\u578b\u63a8\u8ad6\n std::array exts{2, 3};\n std::mdspan m5{arr, exts};\n static_assert(m5.rank_dynamic() == 2);\n assert(m5.size() == 6);\n // m5 := \u52d5\u7684\u8981\u7d20\u6570 2x3 \u306e2\u6b21\u5143\u914d\u5217\u30d3\u30e5\u30fc\n }\n { // (6) : \u591a\u6b21\u5143\u914d\u5217\u30b5\u30a4\u30ba\u304b\u3089\u578b\u63a8\u8ad6\n std::extents<size_t, 2, std::dynamic_extent> ext{3};\n std::mdspan m6{arr, ext};\n static_assert(m6.rank() == 2 && m6.rank_dynamic() == 1);\n assert(m6.size() == 6);\n // m6 := \u9759\u7684\u8981\u7d20\u65702 x \u52d5\u7684\u8981\u7d20\u65703 \u306e2\u6b21\u5143\u914d\u5217\u30d3\u30e5\u30fc\n }\n { // (7) : \u30ec\u30a4\u30a2\u30a6\u30c8\u30de\u30c3\u30d4\u30f3\u30b0\u304b\u3089\u578b\u63a8\u8ad6\n using Ext2D = std::dextents<size_t, 2>;\n std::layout_stride::mapping<Ext2D> map{Ext2D{2, 2}, std::array{3, 1}};\n std::mdspan m7{arr, map};\n static_assert(m7.rank_dynamic() == 2);\n assert(m7.size() == 4);\n // m7 := \u52d5\u7684\u8981\u7d20\u6570 2x2\uff08\u30b9\u30c8\u30e9\u30a4\u30c9\u5e45=[3,1]\uff09 \u306e2\u6b21\u5143\u914d\u5217\u30d3\u30e5\u30fc\n }\n { // (8) : \u30ec\u30a4\u30a2\u30a6\u30c8\u30de\u30c3\u30d4\u30f3\u30b0\uff0b\u8981\u7d20\u30a2\u30af\u30bb\u30b5\u304b\u3089\u578b\u63a8\u8ad6\n using Ext2D = std::dextents<size_t, 2>;\n std::layout_stride::mapping<Ext2D> map{Ext2D{2, 2}, std::array{3, 1}};\n std::default_accessor<const int> acc;\n std::mdspan m8{arr, map, acc};\n static_assert(m8.rank_dynamic() == 2);\n assert(m8.size() == 4);\n // m8 := \u52d5\u7684\u8981\u7d20\u6570 2x2\uff08\u30b9\u30c8\u30e9\u30a4\u30c9\u5e45=[3,1]\uff09 \u306e\u8aad\u307f\u53d6\u308a\u5c02\u75282\u6b21\u5143\u914d\u5217\u30d3\u30e5\u30fc\n }\n}\n"}], "page_id": ["reference", "mdspan", "mdspan", "op_deduction_guide"]}"> |
| 71 | +<header data-kunai-mdinfo="{"meta": {"header": ["mdspan"], "namespace": ["std"], "class": ["mdspan"], "cpp": ["cpp23"]}, "sources": [{"id": "76b3229abd913178ccd06507e0bcba690ee0f46c", "source": "#include <cassert>\n#include <array>\n#include <span>\n#include <mdspan>\n#include <type_traits>\n\ntemplate <int N>\nconstexpr auto Int = std::integral_constant<int, N>{};\n\nint main()\n{\n int arr[] = {1, 2, 3, 4, 5, 6};\n\n { // (1) :\u30001\u6b21\u5143\u914d\u5217\u578b\u304b\u3089\u578b\u63a8\u8ad6\n std::mdspan m1{arr};\n static_assert(m1.rank() == 1 && m1.rank_dynamic() == 0);\n static_assert(m1.static_extent(0) == 6);\n // m1 := \u9759\u7684\u8981\u7d20\u6570 6 \u306e1\u6b21\u5143\u914d\u5217\u30d3\u30e5\u30fc\n\n // 2\u6b21\u5143\u914d\u5217\u578b\u304b\u3089\u306f\u578b\u63a8\u8ad6\u3067\u304d\u306a\u3044\n // int arr2d[2][3] = {{1, 2, 3}, {4, 5, 6}};\n // std::mdspan m1_ng{arr2d};\n // \u4e0b\u8a18\u306f\u63a8\u8ad6\u88dc\u52a9(2)\u306b\u3088\u308a0\u6b21\u5143mdspan\u3068\u306a\u308b\n // std::mdspan m1_d0{&arr2d[0][0]};\n }\n { // (2) : \u30dd\u30a4\u30f3\u30bf\u578b\u304b\u3089\u578b\u63a8\u8ad6\n int* ptr = arr;\n std::mdspan m2{ptr};\n static_assert(m2.rank() == 0);\n assert(m2[] == *ptr);\n // m2 := 0\u6b21\u5143\u914d\u5217\u30d3\u30e5\u30fc\n }\n { // (3) : C++23 \u8981\u7d20\u6570\u30ea\u30b9\u30c8\u304b\u3089\u578b\u63a8\u8ad6\n std::mdspan m3a{arr, 2, 3};\n static_assert(m3a.rank_dynamic() == 2);\n assert(m3a.size() == 6);\n // m3a := \u52d5\u7684\u8981\u7d20\u6570 2x3 \u306e2\u6b21\u5143\u914d\u5217\u30d3\u30e5\u30fc\n }\n { // (3) : C++26 \u6574\u6570\u5b9a\u6570\u8981\u7d20\u6570\u30ea\u30b9\u30c8\u304b\u3089\u578b\u63a8\u8ad6\n std::mdspan m3b{arr, Int<2>, Int<3>};\n static_assert(m3b.rank_dynamic() == 0);\n assert(m3b.size() == 6);\n // m3b := \u9759\u7684\u8981\u7d20\u6570 2x3 \u306e2\u6b21\u5143\u914d\u5217\u30d3\u30e5\u30fc\n }\n { // (4) : \u8981\u7d20\u6570span\u304b\u3089\u578b\u63a8\u8ad6\n int exts[] = {2, 3};\n std::mdspan m4{arr, std::span{exts}};\n static_assert(m4.rank_dynamic() == 2);\n assert(m4.size() == 6);\n // m4 := \u52d5\u7684\u8981\u7d20\u6570 2x3 \u306e2\u6b21\u5143\u914d\u5217\u30d3\u30e5\u30fc\n }\n { // (5) : \u8981\u7d20\u6570array\u304b\u3089\u578b\u63a8\u8ad6\n std::array exts{2, 3};\n std::mdspan m5{arr, exts};\n static_assert(m5.rank_dynamic() == 2);\n assert(m5.size() == 6);\n // m5 := \u52d5\u7684\u8981\u7d20\u6570 2x3 \u306e2\u6b21\u5143\u914d\u5217\u30d3\u30e5\u30fc\n }\n { // (6) : \u591a\u6b21\u5143\u914d\u5217\u30b5\u30a4\u30ba\u304b\u3089\u578b\u63a8\u8ad6\n std::extents<size_t, 2, std::dynamic_extent> ext{3};\n std::mdspan m6{arr, ext};\n static_assert(m6.rank() == 2 && m6.rank_dynamic() == 1);\n assert(m6.size() == 6);\n // m6 := \u9759\u7684\u8981\u7d20\u65702 x \u52d5\u7684\u8981\u7d20\u65703 \u306e2\u6b21\u5143\u914d\u5217\u30d3\u30e5\u30fc\n }\n { // (7) : \u30ec\u30a4\u30a2\u30a6\u30c8\u30de\u30c3\u30d4\u30f3\u30b0\u304b\u3089\u578b\u63a8\u8ad6\n using Ext2D = std::dextents<size_t, 2>;\n std::layout_stride::mapping<Ext2D> map{Ext2D{2, 2}, std::array{3, 1}};\n std::mdspan m7{arr, map};\n static_assert(m7.rank_dynamic() == 2);\n assert(m7.size() == 4);\n // m7 := \u52d5\u7684\u8981\u7d20\u6570 2x2\uff08\u30b9\u30c8\u30e9\u30a4\u30c9\u5e45=[3,1]\uff09 \u306e2\u6b21\u5143\u914d\u5217\u30d3\u30e5\u30fc\n }\n { // (8) : \u30ec\u30a4\u30a2\u30a6\u30c8\u30de\u30c3\u30d4\u30f3\u30b0\uff0b\u8981\u7d20\u30a2\u30af\u30bb\u30b5\u304b\u3089\u578b\u63a8\u8ad6\n using Ext2D = std::dextents<size_t, 2>;\n std::layout_stride::mapping<Ext2D> map{Ext2D{2, 2}, std::array{3, 1}};\n std::default_accessor<const int> acc;\n std::mdspan m8{arr, map, acc};\n static_assert(m8.rank_dynamic() == 2);\n assert(m8.size() == 4);\n // m8 := \u52d5\u7684\u8981\u7d20\u6570 2x2\uff08\u30b9\u30c8\u30e9\u30a4\u30c9\u5e45=[3,1]\uff09 \u306e\u8aad\u307f\u53d6\u308a\u5c02\u75282\u6b21\u5143\u914d\u5217\u30d3\u30e5\u30fc\n }\n}\n"}], "page_id": ["reference", "mdspan", "mdspan", "op_deduction_guide"]}"> |
72 | 72 | <nav class="navbar navbar-default" role="navigation">
|
73 | 73 | <div class="container-fluid">
|
74 | 74 | <div class="navbar-header">
|
|
200 | 200 |
|
201 | 201 | <p class="text-right"><small>
|
202 | 202 | 最終更新日時(UTC):
|
203 |
| - <span itemprop="datePublished" content="2024-06-25T08:35:29"> |
204 |
| - 2024年06月25日 08時35分29秒 |
| 203 | + <span itemprop="datePublished" content="2024-06-25T08:44:14"> |
| 204 | + 2024年06月25日 08時44分14秒 |
205 | 205 | </span>
|
206 | 206 | <br/>
|
207 | 207 | <span itemprop="author" itemscope itemtype="http://schema.org/Person">
|
|
239 | 239 | <span class="k">template</span><span class="o"><</span><span class="k">class</span> <span class="nc">ElementType</span><span class="p">,</span> <span class="n">class</span><span class="p">...</span> <span class="n">Integrals</span><span class="o">></span>
|
240 | 240 | <span class="n">requires</span> <span class="p">((</span><span class="n"><a href="../../type_traits/is_convertible.html">is_convertible_v</a></span><span class="o"><</span><span class="n">Integrals</span><span class="p">,</span> <span class="kt">size_t</span><span class="o">></span> <span class="o">&&</span> <span class="p">...)</span> <span class="o">&&</span> <span class="k">sizeof</span><span class="p">...(</span><span class="n">Integrals</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span><span class="p">)</span>
|
241 | 241 | <span class="k">explicit</span> <span class="n">mdspan</span><span class="p">(</span><span class="n">ElementType</span><span class="o">*</span><span class="p">,</span> <span class="n">Integrals</span><span class="p">...)</span>
|
242 |
| - <span class="o">-></span> <span class="n">mdspan</span><span class="o"><</span><span class="n">ElementType</span><span class="p">,</span> <span class="n"><a href="../extents.html">extents</a></span><span class="o"><</span><span class="kt">size_t</span><span class="p">,</span> <span class="n"><a href="../../span/maybe-static-ext.html">maybe-static-ext</a></span><span class="o"><</span><span class="n">Integrals</span><span class="o">></span><span class="p">...</span><span class="o">>></span><span class="p">;</span> <span class="c1">// (3)</span> |
| 242 | + <span class="o">-></span> <span class="n">mdspan</span><span class="o"><</span><span class="n">ElementType</span><span class="p">,</span> <span class="n"><a href="../extents.html">dextents</a></span><span class="o"><</span><span class="kt">size_t</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">...(</span><span class="n">Integrals</span><span class="p">)</span><span class="o">>></span><span class="p">;</span> <span class="c1">// (3) C++23</span> |
| 243 | + <span class="k">template</span><span class="o"><</span><span class="k">class</span> <span class="nc">ElementType</span><span class="p">,</span> <span class="n">class</span><span class="p">...</span> <span class="n">Integrals</span><span class="o">></span> |
| 244 | + <span class="n">requires</span> <span class="p">((</span><span class="n"><a href="../../type_traits/is_convertible.html">is_convertible_v</a></span><span class="o"><</span><span class="n">Integrals</span><span class="p">,</span> <span class="kt">size_t</span><span class="o">></span> <span class="o">&&</span> <span class="p">...)</span> <span class="o">&&</span> <span class="k">sizeof</span><span class="p">...(</span><span class="n">Integrals</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span><span class="p">)</span> |
| 245 | + <span class="k">explicit</span> <span class="n">mdspan</span><span class="p">(</span><span class="n">ElementType</span><span class="o">*</span><span class="p">,</span> <span class="n">Integrals</span><span class="p">...)</span> |
| 246 | + <span class="o">-></span> <span class="n">mdspan</span><span class="o"><</span><span class="n">ElementType</span><span class="p">,</span> <span class="n"><a href="../extents.html">extents</a></span><span class="o"><</span><span class="kt">size_t</span><span class="p">,</span> <span class="n"><a href="../../span/maybe-static-ext.html">maybe-static-ext</a></span><span class="o"><</span><span class="n">Integrals</span><span class="o">></span><span class="p">...</span><span class="o">>></span><span class="p">;</span> <span class="c1">// (3) C++26</span> |
243 | 247 |
|
244 | 248 | <span class="k">template</span><span class="o"><</span><span class="k">class</span> <span class="nc">ElementType</span><span class="p">,</span> <span class="k">class</span> <span class="nc">OtherIndexType</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">N</span><span class="o">></span>
|
245 | 249 | <span class="n">mdspan</span><span class="p">(</span><span class="n">ElementType</span><span class="o">*</span><span class="p">,</span> <span class="n"><a href="../../span/span.html">span</a></span><span class="o"><</span><span class="n">OtherIndexType</span><span class="p">,</span> <span class="n">N</span><span class="o">></span><span class="p">)</span>
|
@@ -275,7 +279,7 @@ <h2>概要</h2>
|
275 | 279 | <h2>備考</h2>
|
276 | 280 | <p>推論補助(2)により、コンパイル時に要素数を取得できないポインタ型引数からは0次元<code>mdspan</code>が推論される。</p>
|
277 | 281 | <h2>例</h2>
|
278 |
| -<p><div class="yata" id="b8e69a8545aab969812e17dc16eebb87db90ad26"><div class="codehilite"><pre><span></span><code><span class="cp">#include</span> <span class="cpf"><a href="../../cassert.html"><cassert></a></span><span class="cp"></span> |
| 282 | +<p><div class="yata" id="76b3229abd913178ccd06507e0bcba690ee0f46c"><div class="codehilite"><pre><span></span><code><span class="cp">#include</span> <span class="cpf"><a href="../../cassert.html"><cassert></a></span><span class="cp"></span> |
279 | 283 | <span class="cp">#include</span> <span class="cpf"><a href="../../array.html"><array></a></span><span class="cp"></span>
|
280 | 284 | <span class="cp">#include</span> <span class="cpf"><a href="../../span.html"><span></a></span><span class="cp"></span>
|
281 | 285 | <span class="cp">#include</span> <span class="cpf"><a href="../../mdspan.html"><mdspan></a></span><span class="cp"></span>
|
@@ -307,12 +311,13 @@ <h2>例</h2>
|
307 | 311 | <span class="n"><a href="../../cassert/assert.html">assert</a></span><span class="p">(</span><span class="n">m2</span><span class="p">[]</span> <span class="o">==</span> <span class="o">*</span><span class="n">ptr</span><span class="p">);</span>
|
308 | 312 | <span class="c1">// m2 := 0次元配列ビュー</span>
|
309 | 313 | <span class="p">}</span>
|
310 |
| - <span class="p">{</span> <span class="c1">// (3) : 要素数リストから型推論</span> |
| 314 | + <span class="p">{</span> <span class="c1">// (3) : C++23 要素数リストから型推論</span> |
311 | 315 | <span class="n"><span style="color:#ff0000">std::mdspan</span></span> <span class="n">m3a</span><span class="p">{</span><span class="n">arr</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">};</span>
|
312 | 316 | <span class="k">static_assert</span><span class="p">(</span><span class="n">m3a</span><span class="p">.</span><span class="n"><a href="rank_dynamic.html">rank_dynamic</a></span><span class="p">()</span> <span class="o">==</span> <span class="mi">2</span><span class="p">);</span>
|
313 | 317 | <span class="n"><a href="../../cassert/assert.html">assert</a></span><span class="p">(</span><span class="n">m3a</span><span class="p">.</span><span class="n"><a href="size.html">size</a></span><span class="p">()</span> <span class="o">==</span> <span class="mi">6</span><span class="p">);</span>
|
314 | 318 | <span class="c1">// m3a := 動的要素数 2x3 の2次元配列ビュー</span>
|
315 |
| - |
| 319 | + <span class="p">}</span> |
| 320 | + <span class="p">{</span> <span class="c1">// (3) : C++26 整数定数要素数リストから型推論</span> |
316 | 321 | <span class="n"><span style="color:#ff0000">std::mdspan</span></span> <span class="n">m3b</span><span class="p">{</span><span class="n">arr</span><span class="p">,</span> <span class="n">Int</span><span class="o"><</span><span class="mi">2</span><span class="o">></span><span class="p">,</span> <span class="n">Int</span><span class="o"><</span><span class="mi">3</span><span class="o">></span><span class="p">};</span>
|
317 | 322 | <span class="k">static_assert</span><span class="p">(</span><span class="n">m3b</span><span class="p">.</span><span class="n"><a href="rank_dynamic.html">rank_dynamic</a></span><span class="p">()</span> <span class="o">==</span> <span class="mi">0</span><span class="p">);</span>
|
318 | 323 | <span class="n"><a href="../../cassert/assert.html">assert</a></span><span class="p">(</span><span class="n">m3b</span><span class="p">.</span><span class="n"><a href="size.html">size</a></span><span class="p">()</span> <span class="o">==</span> <span class="mi">6</span><span class="p">);</span>
|
@@ -382,7 +387,10 @@ <h2>関連項目</h2>
|
382 | 387 | <h2>参照</h2>
|
383 | 388 | <ul>
|
384 | 389 | <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p0009r18.html" target="_blank">P0009R18 MDSPAN</a></li>
|
385 |
| -<li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3029r1.html" target="_blank">P3029R1 Better <code>mdspan</code>'s CTAD</a></li> |
| 390 | +<li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3029r1.html" target="_blank">P3029R1 Better <code>mdspan</code>'s CTAD</a><ul> |
| 391 | +<li>C++26から、(3)で静的要素数への推論がサポートされる。</li> |
| 392 | +</ul> |
| 393 | +</li> |
386 | 394 | </ul></div>
|
387 | 395 |
|
388 | 396 | </div>
|
|
0 commit comments