namespace std {
template <size_t I, class... Types>
typename tuple_element<I, tuple<Types...> >::type&
get(tuple<Types...>& t) noexcept; // (1) C++11
template <size_t I, class... Types>
constexpr tuple_element_t<I, tuple<Types...>>&
get(tuple<Types...>&) noexcept; // (1) C++14
template <size_t I, class... types>
typename tuple_element<I, tuple<Types...> >::type&&
get(tuple<Types...>&& t) noexcept; // (2) C++11
template <size_t I, class... Types>
constexpr tuple_element_t<I, tuple<Types...>>&&
get(tuple<Types...>&&) noexcept; // (2) C++14
template <size_t I, class... Types>
typename tuple_element<I, tuple<Types...> >::type const&
get(const tuple<Types...>& t) noexcept; // (3) C++11
template <size_t I, class... Types>
constexpr const tuple_element_t<I, tuple<Types...>>&
get(const tuple<Types...>& t) noexcept; // (3) C++14
template <size_t I, class... Types>
constexpr const tuple_element_t<I, tuple<Types...> >&&
get(const tuple<Types...>&& t) noexcept; // (4) C++17
template <class T, class... Types>
constexpr T& get(tuple<Types...>& t) noexcept; // (5) C++14
template <class T, class... Types>
constexpr T&& get(tuple<Types...>&& t) noexcept; // (6) C++14
template <class T, class... Types>
constexpr const T& get(const tuple<Types...>& t) noexcept; // (7) C++14
}
概要
tuple
オブジェクトから指定した位置の要素を取得する。
要件
- (1), (2), (3), (4) : テンプレートパラメータ
I
がtuple
の要素数よりも小さいこと。この要件を満たさない場合は、コンパイルエラーとなる。 - (5), (6), (7) : 型
T
がTypes...
の中にひとつだけ含まれること。この要件を満たさない場合は、コンパイルエラーとなる。
戻り値
- (1), (2), (3), (4) :
tuple
オブジェクトt
のI
番目の要素への参照 - (5), (6), (7) :
tuple
オブジェクトt
に含まれるT
型の要素への参照
例外
投げない
備考
- この関数がメンバ関数ではなく非メンバ関数として定義されているのは、ユーザーにtemplate限定子を指定させるのを避けるためである。メンバ関数にした場合、テンプレート内でその関数を使用すると、
t.template get<I>()
のようにtemplateキーワードをユーザーが指定しなければならない
例
基本的な使い方
#include <iostream>
#include <tuple>
#include <string>
int main()
{
std::tuple<int, char, std::string> t(1, 'a', "hello");
// 位置を指定して取得する方法。(1)〜(4)
{
int& i = std::get<0>(t);
char& c = std::get<1>(t);
std::string& s = std::get<2>(t);
std::cout << i << std::endl;
std::cout << c << std::endl;
std::cout << s << std::endl;
}
std::cout << std::endl;
// 型を指定して取得する方法。(5)〜(7)
{
int& i = std::get<int>(t);
char& c = std::get<char>(t);
std::string& s = std::get<std::string>(t);
std::cout << i << std::endl;
std::cout << c << std::endl;
std::cout << s << std::endl;
}
}
出力
1
a
hello
1
a
hello
const右辺値参照版が必要な状況 (4)
#include <iostream>
#include <tuple>
#include <string>
const std::tuple<int, std::string, double> f()
{
return {1, "Hello", 3.14};
}
int main()
{
// f()の戻り値型がconst tuple&&となるので、
// tuple&&をとるオーバーロードでは受け取れない
std::string s = std::get<1>(f());
std::cout << s << std::endl;
}
出力
Hello
get関数をADLで呼び出す (C++20)
#include <iostream>
#include <tuple>
int main() {
std::tuple t{1, 3.14, "Hello"};
std::cout << get<0>(t) << std::endl; // C++17:NG C++20:OK
}
出力
1
バージョン
言語
- C++11
処理系
- Clang: ??
- GCC: 4.6.1 ✅
- ICC: ??
- Visual C++: ??