Namespaces
Variants

std:: tuple

From cppreference.net
Utilities library
定義済みヘッダー <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を個々のオブジェクトに展開する
(関数テンプレート)
転送参照 tuple を作成する
(関数テンプレート)
(C++11)
任意の数のtupleを連結して tuple を作成する
(関数テンプレート)
指定された要素にアクセスする
(関数テンプレート)
(removed in C++20) (removed in C++20) (removed in C++20) (removed in C++20) (removed in C++20) (C++20)
tupleの値を辞書順で比較する
(関数テンプレート)
std::swap アルゴリズムを特殊化する
(関数テンプレート)

ヘルパーコンセプト

型が tupleプロトコル を実装していることを指定
( std::get , std::tuple_element , std::tuple_size )
( 説明専用コンセプト* )

ヘルパークラス

tuple のサイズを取得する


(クラステンプレートの特殊化)

指定された要素の型を取得する
(クラステンプレートの特殊化)
std::uses_allocator 型特性を特殊化する
(クラステンプレートの特殊化)
tuple tuple-like 型の共通参照型を決定する
(クラステンプレートの特殊化)
tuple tuple-like 型の共通型を決定する
(クラステンプレートの特殊化)
tuple のフォーマットサポート
(クラステンプレートの特殊化)
(C++11)
tie を使用して tuple をアンパックする際に要素をスキップするためのプレースホルダー
(定数)

ヘルパー特殊化

template < class ... Ts >

constexpr bool enable_nonlocking_formatter_optimization < std :: tuple < Ts... >>

= ( enable_nonlocking_formatter_optimization < 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]

関連項目

二値タプル、すなわち値のペアを実装する
(クラステンプレート)