Skip to content

Commit 8e8fa98

Browse files
committed
C++26 : 「パラメータパックへのインデックスアクセスを許可」を追加 (close #1230)
1 parent 034b8e6 commit 8e8fa98

File tree

4 files changed

+70
-3
lines changed

4 files changed

+70
-3
lines changed

implementation-status.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@
299299
| P2738R1: [定数式での`void*`からポインタ型へのキャストを許可](/lang/cpp26/constexpr_cast_from_voidptr.md) | 型消去のために`void*`からポインタ型へのキャストを許可する | 14 | 17 | | |
300300
| P2741R3: [`static_assert`の診断メッセージにユーザーが生成した文字列の指定を許可](/lang/cpp26/user-generated_static_assert_messages.md) | `constexpr``S.size()``S.data()`メンバ関数をもつオブジェクトをコンパイル時文字列として指定できるようにする | 14 | 17 | | |
301301
| P2558R2: [基本文字集合に@、$、\`を追加](/lang/cpp26/add_atsign_dollar_graveaccent_to_the_basic_character_set.md) | C言語との互換性のためにこれらの文字を基本文字集合に追加 | | Yes | | |
302-
| P2662R3: [パラメータパックへのインデックスアクセスを許可](/lang/cpp26/pack_indexing.md.nolink) | 可変引数テンプレートのパラメータパックに添字アクセスできるようにする | 15 | | | |
302+
| P2662R3: [パラメータパックへのインデックスアクセスを許可](/lang/cpp26/pack_indexing.md) | 可変引数テンプレートのパラメータパックに添字アクセスできるようにする | 15 | | | |
303303
| P2864R2: [非推奨となっていた列挙値から算術型への暗黙変換を削除](/lang/cpp26/remove_deprecated_arithmetic_conversion_on_enumerations.md) | C++20から非推奨となっていた列挙値への算術演算で算術型に暗黙変換される仕様を削除 | 14 | 18 | | |
304304
| P2748R5: [返却された左辺値から暗黙変換された一時オブジェクトが参照に束縛されることを禁止する](/lang/cpp26/disallow_binding_a_returned_glvalue_to_a_temporary.md) | 寿命切れの変数によって引き起こされるバグを防止する | 14 | 19 | | |
305305
| P3106R1: [要素数不明の配列を集成体初期化する規則を明確化](/lang/cpp26/clarifying_rules_for_brace_elision_in_aggregate_initialization.md.nolink) | 配列要素の集成体初期化で`{}`が省略された場合の矛盾していた規定を修正 | yes | 17 | | |

lang/cpp11/variadic_templates.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ void f(const T1& t1, const T2& t2, const T3& t3);
389389
## <a id="relative-page" href="#relative-page">関連項目</a>
390390
- [C++11 可変引数マクロ](variadic_macros.md)
391391
- [C++17 畳み込み式](/lang/cpp17/folding_expressions.md)
392-
- [C++26 パラメータパックへのインデックスアクセスを許可](/lang/cpp26/pack_indexing.md.nolink)
392+
- [C++26 パラメータパックへのインデックスアクセスを許可](/lang/cpp26/pack_indexing.md)
393393
- [C++26 可変引数テンプレートで`friend`宣言をできるようにする](/lang/cpp26/variadic_friends.md)
394394

395395

lang/cpp26.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ C++26とは、2026年中に改訂される予定の、C++バージョンの通
6565

6666
| 言語機能 | 説明 |
6767
|----------|------|
68-
| [パラメータパックへのインデックスアクセスを許可](/lang/cpp26/pack_indexing.md.nolink) | 可変引数テンプレートのパラメータパックに添字アクセスできるようにする |
68+
| [パラメータパックへのインデックスアクセスを許可](/lang/cpp26/pack_indexing.md) | 可変引数テンプレートのパラメータパックに添字アクセスできるようにする |
6969
| [制約式内での畳み込み式の順序付け](/lang/cpp26/ordering_of_constraints_involving_fold_expressions.md.nolink) | 畳み込み式では全体ではなく個別の制約を原子制約式として扱う |
7070
| [可変引数テンプレートで`friend`宣言をできるようにする](/lang/cpp26/variadic_friends.md) | クラステンプレートの可変引数テンプレートでまとめて`friend`宣言できるようにする |
7171
| [コンセプトと変数テンプレートにテンプレートテンプレートパラメータのサポートを追加](/lang/cpp26/concept_and_variable-template_template-parameters.md.nolink) | テンプレート引数をあとで指定するテンプレートテンプレートパラメータを、コンセプトと変数テンプレートでも使用できるようにする |

lang/cpp26/pack_indexing.md

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# パラメータパックへのインデックスアクセスを許可 [P2662R3]
2+
* cpp26[meta cpp]
3+
4+
<!-- start lang caution -->
5+
6+
このページはC++26に採用される見込みの言語機能の変更を解説しています。
7+
8+
のちのC++規格でさらに変更される場合があるため[関連項目](#relative-page)を参照してください。
9+
10+
<!-- last lang caution -->
11+
12+
## 概要
13+
C++26では、可変引数テンプレートのパラメータパックに対してインデックスアクセスを行う添字構文が導入される。この機能により、パラメータパックの特定の要素に直接アクセスできるようになる。
14+
15+
これにより、従来の再帰的テンプレートメタプログラミングやタプルの[`std::get()`](/reference/tuple/tuple/get.md)などを使用する必要がなくなり、コードの簡潔さと可読性が向上する。
16+
17+
```cpp
18+
template <class... T>
19+
constexpr auto first_plus_last(T... values) -> T...[0] {
20+
return T...[0](values...[0] + values...[sizeof...(values)-1]);
21+
}
22+
23+
int main() {
24+
//first_plus_last(); // コンパイルエラー!
25+
static_assert(first_plus_last(1, 2, 10) == 11);
26+
}
27+
```
28+
29+
パラメータパックへのインデックスアクセスは、値のパラメータパック、および型のパラメータパックどちらに対しても使用できる。
30+
31+
インデックスが範囲外の場合、コンパイルエラーとなる。
32+
33+
34+
## 例
35+
### N番目の要素を取得する
36+
```cpp example
37+
#include <iostream>
38+
#include <utility>
39+
#include <tuple>
40+
41+
template <int I, typename... Args>
42+
void print_nth(Args&&... args) {
43+
// C++23実装 : タプルに変換してからI番目の要素を参照する
44+
// auto value = std::get<I>(std::forward_as_tuple(std::forward<Args>(args)...));
45+
46+
// C++26実装 : 添字構文でI番目の要素を参照する
47+
auto value = args...[I];
48+
49+
std::cout << value << std::endl;
50+
}
51+
52+
int main() {
53+
print_nth<2>("A", "B", "C", "D"); // 出力: C
54+
}
55+
```
56+
57+
#### 出力
58+
```
59+
C
60+
```
61+
62+
## <a id="relative-page" href="#relative-page">関連項目</a>
63+
- [C++11 可変引数テンプレート](/lang/cpp11/variadic_templates.md)
64+
65+
66+
## 参照
67+
- [P2662R3 Pack Indexing](https://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2662r3.pdf)

0 commit comments

Comments
 (0)