std:: tuple
|
定義済みヘッダー
<tuple>
|
||
|
template
<
class
...
Types
>
class tuple ; |
(C++11以降) | |
クラステンプレート
std::tuple
は、異種の値の固定サイズコレクションです。これは
std::pair
の一般化です。
Types
内のすべての
Ti
について
std::
is_trivially_destructible
<
Ti
>
::
value
が
true
の場合、
std::tuple
のデストラクタはトリビアルです。
プログラムが
explicit
または
partial
特殊化の
std::tuple
を宣言する場合、そのプログラムは診断なしに不適格となる。
目次 |
テンプレートパラメータ
| Types... | - | タプルが格納する要素の型。空リストがサポートされています。 |
メンバー関数
新しい
tuple
を構築する
(公開メンバ関数) |
|
ある
tuple
の内容を別の
tuple
に代入する
(公開メンバ関数) |
|
二つの
tuple
の内容を交換する
(公開メンバ関数) |
非メンバー関数
|
(C++11)
|
引数の型によって定義される型の
tuple
オブジェクトを作成する
(関数テンプレート) |
|
(C++11)
|
左辺値参照の
tuple
を作成する、またはtupleを個々のオブジェクトに展開する
(関数テンプレート) |
|
(C++11)
|
転送参照
の
tuple
を作成する
(関数テンプレート) |
|
(C++11)
|
任意の数のtupleを連結して
tuple
を作成する
(関数テンプレート) |
|
(C++11)
|
指定された要素にアクセスする
(関数テンプレート) |
|
(removed in C++20)
(removed in C++20)
(removed in C++20)
(removed in C++20)
(removed in C++20)
(C++20)
|
tupleの値を辞書順で比較する
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
ヘルパーコンセプト
|
(C++23)
|
型が
tupleプロトコル
を実装していることを指定
( std::get , std::tuple_element , std::tuple_size ) ( 説明専用コンセプト* ) |
ヘルパークラス
|
(C++11)
|
tuple
のサイズを取得する
|
|
(C++11)
|
指定された要素の型を取得する
(クラステンプレートの特殊化) |
|
(C++11)
|
std::uses_allocator
型特性を特殊化する
(クラステンプレートの特殊化) |
tuple
と
tuple-like
型の共通参照型を決定する
(クラステンプレートの特殊化) |
|
|
(C++23)
|
tuple
と
tuple-like
型の共通型を決定する
(クラステンプレートの特殊化) |
|
(C++23)
|
tuple
のフォーマットサポート
(クラステンプレートの特殊化) |
|
(C++11)
|
tie
を使用して
tuple
をアンパックする際に要素をスキップするためのプレースホルダー
(定数) |
ヘルパー特殊化
|
template
<
class
...
Ts
>
constexpr
bool
enable_nonlocking_formatter_optimization
<
std
::
tuple
<
Ts...
>>
|
(C++23以降) | |
この
std::enable_nonlocking_formatter_optimization
の特殊化は、
std::print
および
std::println
が
tuple
オブジェクトを出力する際、各要素型がこれを有効化している場合に効率的な実装を可能にします。
推論ガイド (C++17以降)
注記
タプルの「形状」――そのサイズ、要素の型、およびそれらの型の順序――は型シグネチャの一部であるため、これらはすべてコンパイル時に利用可能でなければならず、他のコンパイル時情報にのみ依存できます。これは、タプルに対する多くの条件付き操作――特に条件付き先頭追加/末尾追加およびフィルタ――は、条件がコンパイル時に評価可能な場合にのみ実行可能であることを意味します。例えば、 std :: tuple < int , double , int > が与えられた場合、型によるフィルタリング――例えば std :: tuple < int , int > を返す――は可能ですが、各要素が正であるかどうかによるフィルタリング(これはタプルの実行時値に応じて異なる型シグネチャを持つことになる)は、すべての要素自体が constexpr でない限り不可能です。
回避策として、 std:: optional のタプルを使用する方法がありますが、実行時情報に基づいてサイズを調整する方法は依然として存在しません。
N4387 (C++11に対する欠陥報告として適用)が導入されるまで、関数はcopy-list-initializationを使用してタプルを返すことができませんでした:
std::tuple<int, int> foo_tuple() { return {1, -1}; // N4387までエラー return std::tuple<int, int>{1, -1}; // 常に動作 return std::make_tuple(1, -1); // 常に動作 }
例
#include <iostream> #include <stdexcept> #include <string> #include <tuple> std::tuple<double, char, std::string> get_student(int id) { switch (id) { case 0: return {3.8, 'A', "Lisa Simpson"}; case 1: return {2.9, 'C', "Milhouse Van Houten"}; case 2: return {1.7, 'D', "Ralph Wiggum"}; case 3: return {0.6, 'F', "Bart Simpson"}; } throw std::invalid_argument("id"); } int main() { const auto student0 = get_student(0); std::cout << "ID: 0, " << "GPA: " << std::get<0>(student0) << ", " << "grade: " << std::get<1>(student0) << ", " << "name: " << std::get<2>(student0) << '\n'; const auto student1 = get_student(1); std::cout << "ID: 1, " << "GPA: " << std::get<double>(student1) << ", " << "grade: " << std::get<char>(student1) << ", " << "name: " << std::get<std::string>(student1) << '\n'; double gpa2; char grade2; std::string name2; std::tie(gpa2, grade2, name2) = get_student(2); std::cout << "ID: 2, " << "GPA: " << gpa2 << ", " << "grade: " << grade2 << ", " << "name: " << name2 << '\n'; // C++17 structured binding: const auto [gpa3, grade3, name3] = get_student(3); std::cout << "ID: 3, " << "GPA: " << gpa3 << ", " << "grade: " << grade3 << ", " << "name: " << name3 << '\n'; }
出力:
ID: 0, GPA: 3.8, grade: A, name: Lisa Simpson ID: 1, GPA: 2.9, grade: C, name: Milhouse Van Houten ID: 2, GPA: 1.7, grade: D, name: Ralph Wiggum ID: 3, GPA: 0.6, grade: F, name: Bart Simpson
欠陥報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 2796 | C++11 |
std::tuple
のデストラクタの自明性が未規定
|
規定 |
| LWG 3990 | C++11 |
プログラムが
std::tuple
の明示的特殊化または
部分特殊化を宣言可能であった |
この場合、プログラムは不適格
(診断は要求されない) |
参考文献
- C++23標準 (ISO/IEC 14882:2024):
-
- 22.4 タプル [tuple]
- C++20 標準 (ISO/IEC 14882:2020):
-
- 20.5 タプル [tuple]
- C++17標準 (ISO/IEC 14882:2017):
-
- 23.5 タプル [tuple]
- C++14標準 (ISO/IEC 14882:2014):
-
- 20.4 タプル [tuple]
- C++11標準 (ISO/IEC 14882:2011):
-
- 20.4 タプル [tuple]
関連項目
|
二値タプル、すなわち値のペアを実装する
(クラステンプレート) |