namespace std {
template <std::size_t I, class T> class tuple_element;
template <std::size_t I, class T, T... Values>
struct tuple_element<I, integer_sequence<T, Values...>> {
using type = T;
};
template <std::size_t I, class T, T... Values>
struct tuple_element<I, const integer_sequence<T, Values...>> {
using type = T;
};
}
概要
tuple_elementは、タプルとして見なせる型から、I番目の要素型を取得するためのクラスである。
<utility>ヘッダでは、integer_sequenceに関する特殊化を提供する。これにより、構造化束縛およびtemplate for文でinteger_sequenceを使用できる。
適格要件
I < sizeof...(Values)であること
例
基本的な使い方
#include <utility>
#include <type_traits>
int main()
{
using Seq = std::integer_sequence<int, 0, 1, 2>;
static_assert(std::is_same_v<
std::tuple_element_t<0, Seq>,
int
>);
}
出力
構造化束縛で使用する
構造化束縛はtuple_elementによって各要素の型を決定する。
#include <iostream>
#include <utility>
template <std::size_t Count>
void run() {
// tuple_element<I, integer_sequence<size_t, ...>>::type が size_t であるため、
// 各要素は size_t として束縛される
constexpr auto [...Index] = std::make_index_sequence<Count>{};
((std::cout << Index << ' '), ...);
std::cout << std::endl;
}
int main()
{
run<3>();
}
出力
0 1 2
template for文で使用する
template for文はループ変数の型推論にtuple_elementを利用する。
#include <iostream>
#include <utility>
int main()
{
// tuple_element<I, integer_sequence<int, ...>>::type は int
template for (auto I : std::integer_sequence<int, 10, 20, 30>{}) {
std::cout << I << ' ';
}
std::cout << std::endl;
}
出力
10 20 30
バージョン
言語
- C++26
処理系
- Clang: 23 ✅
- GCC: 16.1 ✅
- Visual C++: 2026 Update 2 ❌