std::get(std::tuple)
ja.cppreference.net より
| ヘッダ <tuple>
|
||
template< std::size_t I, class... Types >
typename std::tuple_element<I, std::tuple<Types...>>::type&
get( std::tuple<Types...>& t ) noexcept;
|
(1) | (C++11以上) (constexpr C++14以上) |
template< std::size_t I, class... Types >
typename std::tuple_element<I, std::tuple<Types...>>::type&&
get( std::tuple<Types...>&& t ) noexcept;
|
(2) | (C++11以上) (constexpr C++14以上) |
template< std::size_t I, class... Types >
const typename std::tuple_element<I, std::tuple<Types...>>::type&
get( const std::tuple<Types...>& t ) noexcept;
|
(3) | (C++11以上) (constexpr C++14以上) |
template< std::size_t I, class... Types >
const typename std::tuple_element<I, std::tuple<Types...>>::type&&
get( const std::tuple<Types...>&& t ) noexcept;
|
(4) | (C++11以上) (constexpr C++14以上) |
template< class T, class... Types >
constexpr T& get( std::tuple<Types...>& t ) noexcept;
|
(5) | (C++14以上) |
template< class T, class... Types >
constexpr T&& get( std::tuple<Types...>&& t ) noexcept;
|
(6) | (C++14以上) |
template< class T, class... Types >
constexpr const T& get( const std::tuple<Types...>& t ) noexcept;
|
(7) | (C++14以上) |
template< class T, class... Types >
constexpr const T&& get( const std::tuple<Types...>&& t ) noexcept;
|
(8) | (C++14以上) |
1-4) タプルから
I番目の要素を抽出します。 I は [0, sizeof...(Types)) 内の整数値でなければなりません。5-8) タプル
t から、その型が T である要素を抽出します。タプルがその型の要素をちょうど1つ持たない場合はコンパイルに失敗します。パラメータ
| t | - | 内容を抽出するタプル |
戻り値
選択された要素への参照 t 。
注記
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_tuples_by_type
|
201304L
|
(C++14) | 型によるタプルのアドレッシング ( 5-8 ) |
例
このコードを実行
#include <cassert> #include <iostream> #include <string> #include <tuple> int main() { auto x = std::make_tuple(1, "Foo", 3.14); // インデックスベースのアクセス std::cout << "( " << std::get<0>(x) << ", " << std::get<1>(x) << ", " << std::get<2>(x) << " )\n"; // 型ベースのアクセス (C++14以降) std::cout << "( " << std::get<int>(x) << ", " << std::get<const char*>(x) << ", " << std::get<double>(x) << " )\n"; const std::tuple<int, const int, double, double> y(1, 2, 6.9, 9.6); const int& i1 = std::get<int>(y); // OK: 曖昧ではない assert(i1 == 1); const int& i2 = std::get<const int>(y); // OK: 曖昧ではない assert(i2 == 2); // const double& d = std::get<double>(y); // エラー: 不適格 (曖昧) // 注: std::tieと構造化束縛は // タプルを個々のオブジェクトに展開するために使用できます }
出力:
( 1, Foo, 3.14 ) ( 1, Foo, 3.14 )
欠陥報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 2485 |
C++11 (インデックスによる)
C++14 (型による) |
const tuple && のオーバーロードが存在しない | これらのオーバーロードを追加 ( ( 4 ) および ( 8 ) ) |
関連項目
|
(C++11)
|
arrayの要素にアクセスする
(関数テンプレート) |
|
(C++11)
|
pairの要素にアクセスする
(関数テンプレート) |
|
(C++17)
|
インデックスまたは型(型が一意の場合)を指定してvariantの値を読み取る。エラー時には例外をスローする
(関数テンプレート) |
|
(C++20)
|
std::ranges::subrange
からイテレータまたは番兵を取得する
(関数テンプレート) |
|
(C++26)
|
std::complex
から実部または虚部への参照を取得する
(関数テンプレート) |
|
(C++11)
|
左辺値参照の
tuple
を作成する、またはtupleを個々のオブジェクトに展開する
(関数テンプレート) |
| Structured binding (C++17) | 指定された名前を初期化子のサブオブジェクトまたはtuple要素にバインドする |