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<classT, tuple-like Tuple,std::size_t...I>// no constraint on Tuple before C++23
constexprT/*make-from-tuple-impl*/(Tuple&&t,std::index_sequence<I...>)
{
returnT(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++.
| Отчёт об ошибке | Применяется к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 3528 | C++17 | приведение, содержащее reinterpret_cast и т. п., допускалось для кортежа из одного элемента | запрещено |
См. также
|
(C++11) | создаёт tuple объект типа, определяемого типами аргументов (шаблон функции) |
|
(C++11) | создаёт tuple из пересылающих ссылок (шаблон функции) |
|
(C++17) | вызывает функцию с кортежем аргументов (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/make_from_tuple