Namespaces
Variants

std::make_from_tuple

ja.cppreference.net より
 
 
ユーティリティライブラリ
言語サポート
型サポート(基本型、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)
swap および 型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
共通語彙型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(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, std::size_t... I> // no constraint on Tuple before C++23
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>>>{}
);
.

もし

  • std::tuple_size_v<std::remove_reference_t<Tuple>> が 1 であり、かつ std::reference_constructs_from_temporary_v<
    T, decltype(std::get<0>(std::declval<Tuple>()))>
    が true である場合、または
(C++23 以降)
  • std::is_constructible_v<T, decltype(std::get<I>(std::declval<Tuple>()))...> が false である場合、

プログラムは ill-formed となる。

パラメータ

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

戻り値

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

注記

Tuple は std::tuple である必要はなく、 std::get および std::tuple_size をサポートする任意の型を使用できる。特に、 std::array および std::pair を使用できる。

(C++23まで)

Tuple はタプルライクであるように制約され、すなわち、その中の各型は std::tuple の特殊化、または tuple-like をモデル化する他の型( std::array や std::pair など)であることが要求される。

(C++23以降)

保証された copy elision により、 T はmovableである必要はありません。

機能テスト マクロ 値 標準 機能
__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 などを含むキャストが許可されていた 禁止

関連項目

(C++11)
引数の型によって定義される型の tuple オブジェクトを作成する
(関数テンプレート)
転送参照 の tuple を作成する
(関数テンプレート)
(C++17)
引数のタプルで関数を呼び出す
(関数テンプレート)