std::make_from_tuple
| Definiert in der Header-Datei <tuple> |
||
template< class T, class Tuple > constexpr T make_from_tuple( Tuple&& t ); |
(seit C++17) (bis C++23) |
|
| template< class T, tuple-like Tuple > constexpr T make_from_tuple( Tuple&& t ); |
(seit C++23) | |
Erzeugt ein Objekt vom Typ T, wobei die Elemente des Tupels t als Argumente für den Konstruktor verwendet werden.
Gegeben die expositions-only Funktion /*make-from-tuple-impl*/, die wie folgt definiert ist:
template<class T, tuple-like Tuple, std::size_t... I> // Kein Constraint für Tuple vor C++23
constexpr T /*make-from-tuple-impl*/(Tuple&& t, std::index_sequence<I...>)
{
return T(std::get<I>(std::forward<Tuple>(t))...);
}
Die Wirkung ist äquivalent zu
return /*make-from-tuple-impl*/<T>(
std::forward<Tuple>(t),
std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>{}
);.
Wenn
|
(seit C++23) |
- std::is_constructible_v<T, decltype(std::get<I>(std::declval<Tuple>()))...> gleich false ist,
ist das Programm fehlerhaft.
Inhalt |
[edit] Parameter
| t | - | Tupel, dessen Elemente als Argumente für den Konstruktor von T verwendet werden sollen |
[edit] Rückgabewert
Das erzeugte T-Objekt oder eine Referenz darauf.
[edit] Hinweise
|
|
(bis C++23) |
|
|
(seit C++23) |
Aufgrund der garantierten Copy Elision muss T nicht verschiebbar sein.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_make_from_tuple |
201606L |
(C++17) | std::make_from_tuple
|
[edit] Beispiel
#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)); }
Ausgabe
42, 3.14, 0
[edit] Defect Reports
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 3528 | C++17 | cast mit reinterpret_cast etc. war im Fall eines 1-Tupels erlaubt | verboten |
[edit] Siehe auch
| (C++11) |
erstellt ein tuple-Objekt vom Typ, der durch die Argumenttypen definiert ist(function template) |
| (C++11) |
erstellt ein tuple aus Forwarding-Referenzen(function template) |
| (C++17) |
ruft eine Funktion mit einem Tupel von Argumenten auf (Funktionsvorlage) |