最終更新日時(UTC):
が更新

履歴 編集

パラメータパックへのインデックスアクセスを許可 [P2662R3](C++26)

このページはC++26に採用される見込みの言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

概要

C++26では、可変引数テンプレートのパラメータパックに対してインデックスアクセスを行う添字構文が導入される。この機能により、パラメータパックの特定の要素に直接アクセスできるようになる。

これにより、従来の再帰的テンプレートメタプログラミングやタプルのstd::get()などを使用する必要がなくなり、コードの簡潔さと可読性が向上する。

template <class... T>
constexpr auto first_plus_last(T... values) -> T...[0] {
  return T...[0](values...[0] + values...[sizeof...(values)-1]);
}

int main() {
  //first_plus_last(); // コンパイルエラー!
  static_assert(first_plus_last(1, 2, 10) == 11);
}

パラメータパックへのインデックスアクセスは、値のパラメータパック、および型のパラメータパックどちらに対しても使用できる。

インデックスが範囲外の場合、コンパイルエラーとなる。

N番目の要素を取得する

#include <iostream>
#include <utility>
#include <tuple>

template <int I, typename... Args>
void print_nth(Args&&... args) {
  // C++23実装 : タプルに変換してからI番目の要素を参照する
  // auto value = std::get<I>(std::forward_as_tuple(std::forward<Args>(args)...));

  // C++26実装 : 添字構文でI番目の要素を参照する
  auto value = args...[I];

  std::cout << value << std::endl;
}

int main() {
  print_nth<2>("A", "B", "C", "D"); // 出力: C
}

出力

C

関連項目

参照