Namespaces
Variants

std::make_from_tuple

Материал из ru.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)
 
Определён в заголовке <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>>>{}
);
.

Если

  • 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,

программа считается некорректной.

Параметры

t - кортеж, элементы которого будут использоваться в качестве аргументов для конструктора T

Возвращаемое значение

Сконструированный T объект или ссылка.

Примечания

Tuple не обязательно должен быть std::tuple , вместо этого может быть любым типом, который поддерживает std::get и std::tuple_size ; в частности, могут использоваться std::array и std::pair .

(до C++23)

Tuple ограничен требованием быть tuple-like, т.е. каждый тип в нём должен быть специализацией std::tuple или другого типа (такого как std::array и std::pair ), который моделирует tuple-like .

(начиная с 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 Applied to Behavior as published Correct behavior
LWG 3528 C++17 приведение, содержащее reinterpret_cast и т.д., было разрешено в случае 1-кортежа запрещено

Смотрите также

(C++11)
создает объект tuple типа, определенного типами аргументов
(шаблон функции)
создает tuple из forwarding references
(шаблон функции)
(C++17)
вызывает функцию с кортежем аргументов
(шаблон функции)