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> // 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>>>{}
);
Если
| (с 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 | Разрешался reinterpret_cast и др. в случае 1-кортежа | Запрещено |
См. также
|
(C++11) | создаёт объект tuple типа, определяемого типами аргументов (шаблон функции) |
|
(C++11) | создаёт кортеж ссылок на передачу (шаблон функции) |
|
(C++17) | вызывает функцию с кортежем аргументов (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/make_from_tuple