std::make_from_tuple
| ヘッダ <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から) |
- std::is_constructible_v<T, decltype(std::get<I>(std::declval<Tuple>()))...> が false の場合、
プログラムは不適格である。
目次 |
[編集] パラメータ
| t | - | Tのコンストラクタの引数として使用される要素を持つタプル。 |
[編集] 戻り値
構築されたTオブジェクトまたは参照。
[編集] 備考
|
|
(C++23まで) |
|
|
(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などを含むキャストが許可されていた。 | 禁止された |
[編集] 関連項目
| (C++11) |
引数型によって定義された型の tuple オブジェクトを生成する(関数テンプレート) |
| (C++11) |
転送参照の tuple を生成する(関数テンプレート) |
| (C++17) |
引数のタプルを使って関数を呼び出す (関数テンプレート) |