Namespaces
Variants

std:: make_from_tuple

From cppreference.net
Utilities library
Определено в заголовочном файле <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)

программа является некорректной.

Содержание

Параметры

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)
вызывает функцию с кортежем аргументов
(шаблон функции)