Skip to content

Commit 03e4a2f

Browse files
author
cpprefjp-autoupdate
committed
update automatically
1 parent 5dde55d commit 03e4a2f

File tree

3 files changed

+108
-91
lines changed

3 files changed

+108
-91
lines changed

reference/iterator/projected.html

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,8 @@
188188

189189
<p class="text-right"><small>
190190
最終更新日時(UTC):
191-
<span itemprop="datePublished" content="2025-05-23T07:13:32">
192-
2025年05月23日 07時13分32秒
191+
<span itemprop="datePublished" content="2025-05-28T05:49:37">
192+
2025年05月28日 05時49分37秒
193193
</span>
194194
<br/>
195195
<span itemprop="author" itemscope itemtype="http://schema.org/Person">
@@ -214,26 +214,48 @@
214214

215215
<div class="identifier-type">type-alias</div><div class="header">&lt;iterator&gt;</div><h1 itemprop="name"><span class="namespace" title="namespace std">std::</span><span class="token">projected</span><span class="cpp cpp20" title="C++20で追加">(C++20)</span></h1>
216216
<div itemprop="articleBody"><p><div class="codehilite"><pre><span></span><code><span class="k">namespace</span> <span class="n">std</span> <span class="p">{</span>
217-
218-
<span class="k">template</span><span class="o">&lt;</span><span class="n"><a href="indirectly_readable.html">indirectly_readable</a></span> <span class="n">I</span><span class="p">,</span> <span class="n"><a href="indirectly_unary_invocable.html">indirectly_regular_unary_invocable</a></span><span class="o">&lt;</span><span class="n">I</span><span class="o">&gt;</span> <span class="n">Proj</span><span class="o">&gt;</span>
217+
<span class="c1">// (1) C++20の定義</span>
218+
<span class="k">template</span> <span class="o">&lt;</span><span class="n"><a href="indirectly_readable.html">indirectly_readable</a></span> <span class="n">I</span><span class="p">,</span> <span class="n"><a href="indirectly_unary_invocable.html">indirectly_regular_unary_invocable</a></span><span class="o">&lt;</span><span class="n">I</span><span class="o">&gt;</span> <span class="n">Proj</span><span class="o">&gt;</span>
219219
<span class="k">struct</span> <span class="n"><a href="">projected</a></span> <span class="p">{</span>
220220
<span class="k">using</span> <span class="n">value_type</span> <span class="o">=</span> <span class="n"><a href="../type_traits/remove_cvref.html">remove_cvref_t</a></span><span class="o">&lt;</span><span class="n"><a href="indirect_result_t.html">indirect_result_t</a></span><span class="o">&lt;</span><span class="n">Proj</span><span class="o">&amp;</span><span class="p">,</span> <span class="n">I</span><span class="o">&gt;&gt;</span><span class="p">;</span>
221221

222222
<span class="n"><a href="indirect_result_t.html">indirect_result_t</a></span><span class="o">&lt;</span><span class="n">Proj</span><span class="o">&amp;</span><span class="p">,</span> <span class="n">I</span><span class="o">&gt;</span> <span class="k">operator</span><span class="o">*</span><span class="p">()</span> <span class="k">const</span><span class="p">;</span> <span class="c1">// 宣言のみ</span>
223223
<span class="p">};</span>
224-
225-
226224
<span class="c1">// <a href="incrementable_traits.html">incrementable_traits</a>にアダプトする</span>
227-
<span class="k">template</span><span class="o">&lt;</span><span class="n">weakly_incrementable</span> <span class="n">I</span><span class="p">,</span> <span class="k">class</span> <span class="nc">Proj</span><span class="o">&gt;</span>
225+
<span class="k">template</span> <span class="o">&lt;</span><span class="n">weakly_incrementable</span> <span class="n">I</span><span class="p">,</span> <span class="k">class</span> <span class="nc">Proj</span><span class="o">&gt;</span>
228226
<span class="k">struct</span> <span class="n"><a href="incrementable_traits.html">incrementable_traits</a></span><span class="o">&lt;</span><span class="n"><a href="">projected</a></span><span class="o">&lt;</span><span class="n">I</span><span class="p">,</span> <span class="n">Proj</span><span class="o">&gt;&gt;</span> <span class="p">{</span>
229227
<span class="k">using</span> <span class="n">difference_type</span> <span class="o">=</span> <span class="n"><a href="iter_difference_t.html">iter_difference_t</a></span><span class="o">&lt;</span><span class="n">I</span><span class="o">&gt;</span><span class="p">;</span>
230228
<span class="p">};</span>
229+
230+
<span class="c1">// (1) C++26の定義</span>
231+
<span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">I</span><span class="p">,</span> <span class="k">class</span> <span class="nc">Proj</span><span class="o">&gt;</span>
232+
<span class="k">struct</span> <span class="n"><a href="">projected</a></span><span class="o">-</span><span class="n">impl</span> <span class="p">{</span> <span class="c1">// 説明用の型</span>
233+
<span class="k">struct</span> <span class="n">type</span> <span class="p">{</span> <span class="c1">// 説明用の型</span>
234+
<span class="k">using</span> <span class="n">value_type</span> <span class="o">=</span> <span class="n"><a href="../type_traits/remove_cvref.html">remove_cvref_t</a></span><span class="o">&lt;</span><span class="n"><a href="indirect_result_t.html">indirect_result_t</a></span><span class="o">&lt;</span><span class="n">Proj</span><span class="o">&amp;</span><span class="p">,</span> <span class="n">I</span><span class="o">&gt;&gt;</span><span class="p">;</span>
235+
<span class="k">using</span> <span class="n">difference_type</span> <span class="o">=</span> <span class="n"><a href="iter_difference_t.html">iter_difference_t</a></span><span class="o">&lt;</span><span class="n">I</span><span class="o">&gt;</span><span class="p">;</span> <span class="c1">// weakly_incrementableをモデル化する場合にのみ存在する</span>
236+
<span class="n"><a href="indirect_result_t.html">indirect_result_t</a></span><span class="o">&lt;</span><span class="n">Proj</span><span class="o">&amp;</span><span class="p">,</span> <span class="n">I</span><span class="o">&gt;</span> <span class="k">operator</span><span class="o">*</span><span class="p">()</span> <span class="k">const</span><span class="p">;</span> <span class="c1">// 宣言のみで定義なし</span>
237+
<span class="p">};</span>
238+
<span class="p">};</span>
239+
<span class="k">template</span> <span class="o">&lt;</span><span class="n"><a href="indirectly_readable.html">indirectly_readable</a></span> <span class="n">I</span><span class="p">,</span> <span class="n"><a href="indirectly_unary_invocable.html">indirectly_regular_unary_invocable</a></span><span class="o">&lt;</span><span class="n">I</span><span class="o">&gt;</span> <span class="n">Proj</span><span class="o">&gt;</span>
240+
<span class="k">using</span> <span class="n"><a href="">projected</a></span> <span class="o">=</span> <span class="n"><a href="">projected</a></span><span class="o">-</span><span class="n">impl</span><span class="o">&lt;</span><span class="n">I</span><span class="p">,</span> <span class="n">Proj</span><span class="o">&gt;::</span><span class="n">type</span><span class="p">;</span>
231241
<span class="p">}</span>
232242
</code></pre></div>
233243
</p>
234244
<h2>概要</h2>
235245
<p>間接参照可能な型<code>I</code>に任意の射影操作<code>Proj</code>を適用した結果を表す<code><a href="indirectly_readable.html">indirectly_readable</a></code>のモデルとなる型を生成する。</p>
236246
<p>これは射影操作を受け取るコンセプトやアルゴリズムを制約するために使用するものであり、評価される文脈で使用可能ではない。主に、射影操作の結果に対してイテレータ関連のコンセプトを適用する場合に使用する(射影の結果を再び<code>indirectly_readable</code>な型に写す事で、一部のイテレータに対するコンセプトを使いまわす事が出来る)。</p>
247+
<h2>備考</h2>
248+
<ul>
249+
<li>C++26:<ul>
250+
<li>C++20の<code>projected</code>の定義では、<a class="cpprefjp-defined-word" data-desc="実引数依存の名前探索 (Argument Dependent Lookup)。引数の型が所属する名前空間の関数を探索する言語機能">ADL</a>によって<a class="cpprefjp-defined-word" data-desc="型のサイズを決定できない、完全には定義されていない型。例えば先行宣言のみのクラス型、要素数不明の配列型、`void`など。クラス定義内部ではそのクラス自身は不完全型">不完全型</a>に完全な定義を要求してしまっており、以下のようなコードがコンパイルエラーになっていたが、C++26での定義変更によって<a class="cpprefjp-defined-word" data-desc="型のサイズを決定できない、完全には定義されていない型。例えば先行宣言のみのクラス型、要素数不明の配列型、`void`など。クラス定義内部ではそのクラス自身は不完全型">不完全型</a>が許容されるようになった。
251+
<br />
252+
<div class="codehilite"><pre><span></span><code><span class="n">Holder</span><span class="o">&lt;</span><span class="n">Incomplete</span><span class="o">&gt;</span> <span class="o">*</span><span class="n">a</span><span class="p">[</span><span class="mi">10</span><span class="p">]</span> <span class="o">=</span> <span class="p">{};</span>
253+
<span class="n">std</span><span class="o">::</span><span class="n">ranges</span><span class="o">::</span><span class="n">count</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">a</span> <span class="o">+</span> <span class="mi">10</span><span class="p">,</span> <span class="k">nullptr</span><span class="p">);</span> <span class="c1">// コンパイルエラー</span>
254+
</code></pre></div>
255+
</li>
256+
</ul>
257+
</li>
258+
</ul>
237259
<h2></h2>
238260
<p><div class="yata" id="2b4b18e526d12a17bfeac9b2e795cb0858e677fd"><div class="codehilite"><pre><span></span><code><span class="cp">#include</span> <span class="cpf"><a href="../iterator.html">&lt;iterator&gt;</a></span><span class="cp"></span>
239261
<span class="cp">#include</span> <span class="cpf"><a href="../vector.html">&lt;vector&gt;</a></span><span class="cp"></span>
@@ -286,6 +308,7 @@ <h2>関連項目</h2>
286308
<h2>参照</h2>
287309
<ul>
288310
<li><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0896r4.pdf" target="_blank">P0896R4 The One Ranges Proposal (was Merging the Ranges TS)</a></li>
311+
<li><a href="http://open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2538r1.html" target="_blank">P2538R1 ADL-proof <code>std::projected</code></a></li>
289312
</ul></div>
290313

291314
</div>

rss.xml

Lines changed: 77 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,85 @@
22
<feed xmlns="http://www.w3.org/2005/Atom">
33
<title>cpprefjp - C++日本語リファレンス</title>
44
<link href="https://cpprefjp.github.io" />
5-
<updated>2025-05-27T15:53:18.895250</updated>
6-
<id>ab180faa-fddf-40a7-a259-fed6253216d1</id>
5+
<updated>2025-05-28T05:53:12.456076</updated>
6+
<id>2a530736-59f8-414a-b9d8-fdc077fcf0f8</id>
77

88

9+
<entry>
10+
<title>projected -- projected : C++26での不完全型への対策に対応 (close #1185)</title>
11+
<link href="https://cpprefjp.github.io/reference/iterator/projected.html"/>
12+
<id>1fe3de6f2d3c0162a5f2b4b89231c01f20f24380:reference/iterator/projected.md</id>
13+
<updated>2025-05-28T14:49:37+09:00</updated>
14+
15+
<summary type="html">&lt;pre&gt;&lt;code&gt;diff --git a/reference/iterator/projected.md b/reference/iterator/projected.md
16+
index cf694bbc7..85023e7ad 100644
17+
--- a/reference/iterator/projected.md
18+
+++ b/reference/iterator/projected.md
19+
@@ -6,20 +6,30 @@
20+
21+
```cpp
22+
namespace std {
23+
-
24+
- template&amp;lt;indirectly_readable I, indirectly_regular_unary_invocable&amp;lt;I&amp;gt; Proj&amp;gt;
25+
+ // (1) C++20の定義
26+
+ template &amp;lt;indirectly_readable I, indirectly_regular_unary_invocable&amp;lt;I&amp;gt; Proj&amp;gt;
27+
struct projected {
28+
using value_type = remove_cvref_t&amp;lt;indirect_result_t&amp;lt;Proj&amp;amp;, I&amp;gt;&amp;gt;;
29+
30+
indirect_result_t&amp;lt;Proj&amp;amp;, I&amp;gt; operator*() const; // 宣言のみ
31+
};
32+
-
33+
-
34+
// incrementable_traitsにアダプトする
35+
- template&amp;lt;weakly_incrementable I, class Proj&amp;gt;
36+
+ template &amp;lt;weakly_incrementable I, class Proj&amp;gt;
37+
struct incrementable_traits&amp;lt;projected&amp;lt;I, Proj&amp;gt;&amp;gt; {
38+
using difference_type = iter_difference_t&amp;lt;I&amp;gt;;
39+
};
40+
+
41+
+ // (1) C++26の定義
42+
+ template &amp;lt;class I, class Proj&amp;gt;
43+
+ struct projected-impl { // 説明用の型
44+
+ struct type { // 説明用の型
45+
+ using value_type = remove_cvref_t&amp;lt;indirect_result_t&amp;lt;Proj&amp;amp;, I&amp;gt;&amp;gt;;
46+
+ using difference_type = iter_difference_t&amp;lt;I&amp;gt;; // weakly_incrementableをモデル化する場合にのみ存在する
47+
+ indirect_result_t&amp;lt;Proj&amp;amp;, I&amp;gt; operator*() const; // 宣言のみで定義なし
48+
+ };
49+
+ };
50+
+ template &amp;lt;indirectly_readable I, indirectly_regular_unary_invocable&amp;lt;I&amp;gt; Proj&amp;gt;
51+
+ using projected = projected-impl&amp;lt;I, Proj&amp;gt;::type;
52+
}
53+
```
54+
* indirectly_readable[link /reference/iterator/indirectly_readable.md]
55+
@@ -34,6 +44,15 @@ namespace std {
56+
57+
これは射影操作を受け取るコンセプトやアルゴリズムを制約するために使用するものであり、評価される文脈で使用可能ではない。主に、射影操作の結果に対してイテレータ関連のコンセプトを適用する場合に使用する(射影の結果を再び`indirectly_readable`な型に写す事で、一部のイテレータに対するコンセプトを使いまわす事が出来る)。
58+
59+
+
60+
+## 備考
61+
+- C++26:
62+
+ - C++20の`projected`の定義では、ADLによって不完全型に完全な定義を要求してしまっており、以下のようなコードがコンパイルエラーになっていたが、C++26での定義変更によって不完全型が許容されるようになった。
63+
+ ```cpp
64+
+ Holder&amp;lt;Incomplete&amp;gt; *a[10] = {};
65+
+ std::ranges::count(a, a + 10, nullptr); // コンパイルエラー
66+
+ ```
67+
+
68+
## 例
69+
```cpp example
70+
#include &amp;lt;iterator&amp;gt;
71+
@@ -95,3 +114,4 @@ int main() {
72+
## 参照
73+
74+
- [P0896R4 The One Ranges Proposal (was Merging the Ranges TS)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0896r4.pdf)
75+
+- [P2538R1 ADL-proof `std::projected`](http://open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2538r1.html)
76+
&lt;/code&gt;&lt;/pre&gt;</summary>
77+
78+
<author>
79+
<name>Akira Takahashi</name>
80+
<email>[email protected]</email>
81+
</author>
82+
</entry>
83+
984
<entry>
1085
<title>execution -- execution: bulk (#1384)</title>
1186
<link href="https://cpprefjp.github.io/reference/execution/execution.html"/>
@@ -1102,85 +1177,4 @@ index 9fb2c5659..9b4d1be4f 100644
11021177
</author>
11031178
</entry>
11041179

1105-
<entry>
1106-
<title>find -- ranges::find : 射影変換の例を追加</title>
1107-
<link href="https://cpprefjp.github.io/reference/algorithm/ranges_find.html"/>
1108-
<id>0dfcb84d27bb4a6a4eed9c75a13522415335c80a:reference/algorithm/ranges_find.md</id>
1109-
<updated>2025-05-27T17:08:10+09:00</updated>
1110-
1111-
<summary type="html">&lt;pre&gt;&lt;code&gt;diff --git a/reference/algorithm/ranges_find.md b/reference/algorithm/ranges_find.md
1112-
index 7f76d5976..41dfe9d96 100644
1113-
--- a/reference/algorithm/ranges_find.md
1114-
+++ b/reference/algorithm/ranges_find.md
1115-
@@ -102,6 +102,62 @@ int main() {
1116-
found: 1
1117-
```
1118-
1119-
+### 射影変換を使用した例
1120-
+```cpp example
1121-
+#include &amp;lt;algorithm&amp;gt;
1122-
+#include &amp;lt;iostream&amp;gt;
1123-
+#include &amp;lt;vector&amp;gt;
1124-
+#include &amp;lt;string&amp;gt;
1125-
+
1126-
+struct Item {
1127-
+ int id;
1128-
+ std::string name;
1129-
+};
1130-
+
1131-
+int main() {
1132-
+ std::vector&amp;lt;Item&amp;gt; v = {
1133-
+ {1, &amp;#34;aaa&amp;#34;},
1134-
+ {3, &amp;#34;bbb&amp;#34;},
1135-
+ {5, &amp;#34;ccc&amp;#34;}
1136-
+ };
1137-
+
1138-
+ // メンバ変数ポインタを使って特定のメンバ変数で検索
1139-
+ {
1140-
+ auto it = std::ranges::find(
1141-
+ v,
1142-
+ std::string(&amp;#34;bbb&amp;#34;),
1143-
+ &amp;amp;Item::name
1144-
+ );
1145-
+ if (it == v.end()) {
1146-
+ std::cout &amp;lt;&amp;lt; &amp;#34;not found&amp;#34; &amp;lt;&amp;lt; std::endl;
1147-
+ } else {
1148-
+ std::cout &amp;lt;&amp;lt; &amp;#34;found: &amp;#34; &amp;lt;&amp;lt; it-&amp;gt;id &amp;lt;&amp;lt; &amp;#39;,&amp;#39; &amp;lt;&amp;lt; it-&amp;gt;name &amp;lt;&amp;lt; std::endl;
1149-
+ }
1150-
+ }
1151-
+
1152-
+ // ラムダ式で特定のメンバ変数を検索
1153-
+ {
1154-
+ auto it = std::ranges::find(
1155-
+ v,
1156-
+ std::string(&amp;#34;bbb&amp;#34;),
1157-
+ [](const Item&amp;amp; x) { return x.name; }
1158-
+ );
1159-
+ if (it == v.end()) {
1160-
+ std::cout &amp;lt;&amp;lt; &amp;#34;not found&amp;#34; &amp;lt;&amp;lt; std::endl;
1161-
+ } else {
1162-
+ std::cout &amp;lt;&amp;lt; &amp;#34;found: &amp;#34; &amp;lt;&amp;lt; it-&amp;gt;id &amp;lt;&amp;lt; &amp;#39;,&amp;#39; &amp;lt;&amp;lt; it-&amp;gt;name &amp;lt;&amp;lt; std::endl;
1163-
+ }
1164-
+ }
1165-
+}
1166-
+```
1167-
+* std::ranges::find[color ff0000]
1168-
+
1169-
+#### 出力
1170-
+```
1171-
+found: 3,bbb
1172-
+found: 3,bbb
1173-
+```
1174-
+
1175-
### 波カッコ初期化を入力として使用する (C++26)
1176-
```cpp example
1177-
#include &amp;lt;algorithm&amp;gt;
1178-
&lt;/code&gt;&lt;/pre&gt;</summary>
1179-
1180-
<author>
1181-
<name>Akira Takahashi</name>
1182-
<email>[email protected]</email>
1183-
</author>
1184-
</entry>
1185-
11861180
</feed>

sitemap.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4665,7 +4665,7 @@
46654665

46664666
<url>
46674667
<loc>https://cpprefjp.github.io/reference/iterator/projected.html</loc>
4668-
<lastmod>2025-05-26T15:26:00+09:00</lastmod>
4668+
<lastmod>2025-05-28T14:49:37+09:00</lastmod>
46694669
<changefreq>daily</changefreq>
46704670
<priority>0.7</priority>
46714671
</url>

0 commit comments

Comments
 (0)