名前空間
変種
操作

std::make_from_tuple

From cppreference.com
< cpp‎ | utility
 
 
ユーティリティライブラリ
言語サポート
型のサポート (基本型、RTTI)
ライブラリ機能検査マクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)(C++20)(C++20)  
(C++20)
スワップ型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
共通語彙型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
make_from_tuple
(C++17)
(C++23)



 
ヘッダ <tuple> で定義
template< class T, class Tuple >
constexpr T make_from_tuple( Tuple&& t );
(C++17以降)
(C++23まで)
template< class T, tuple-like Tuple >
constexpr T make_from_tuple( Tuple&& t );
(C++23から)

Tのオブジェクトを、タプルtの要素をコンストラクタの引数として使用して構築する。

以下のように定義される、解説専用関数/*make-from-tuple-impl*/が与えられた場合
template<class T, tuple-like Tuple, std::size_t... I> // C++23以前はTupleに対する制約なし
constexpr T /*make-from-tuple-impl*/(Tuple&& t, std::index_sequence<I...>)
{
    return T(std::get<I>(std::forward<Tuple>(t))...);
}

その効果は以下と等価である。
return /*make-from-tuple-impl*/<T>(
    std::forward<Tuple>(t),
    std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>{}
);
.

もし

(C++23から)

プログラムは不適格である。

目次

[編集] パラメータ

t - Tのコンストラクタの引数として使用される要素を持つタプル。

[編集] 戻り値

構築されたTオブジェクトまたは参照。

[編集] 備考

Tuplestd::tupleである必要はなく、代わりにstd::getstd::tuple_sizeをサポートするものであれば何でもよい。特に、std::arraystd::pairを使用できる。

(C++23まで)

Tupleはタプルライクなものに制約されており、つまり、その中の各型はstd::tupleの特殊化であるか、tuple-likeをモデル化する別の型(std::arraystd::pairなど)である必要がある。

(C++23から)

保証されたコピー省略のため、Tはムーブ可能である必要はない。

機能テストマクロ 規格 機能
__cpp_lib_make_from_tuple 201606L (C++17) std::make_from_tuple

[編集]

#include <iostream>
#include <tuple>
 
struct Foo
{
    Foo(int first, float second, int third)
    {
        std::cout << first << ", " << second << ", " << third << '\n';
    }
};
 
int main()
{
    auto tuple = std::make_tuple(42, 3.14f, 0);
    std::make_from_tuple<Foo>(std::move(tuple));
}

出力

42, 3.14, 0

[編集] 欠陥報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 3528 C++17 1タプルの場合、reinterpret_castなどを含むキャストが許可されていた。 禁止された

[編集] 関連項目

引数型によって定義された型の tuple オブジェクトを生成する
(関数テンプレート) [編集]
転送参照tuple を生成する
(関数テンプレート) [編集]
(C++17)
引数のタプルを使って関数を呼び出す
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)