Namespaces
Variants

std::make_from_tuple

De es.cppreference.net
 
 
Biblioteca de utilidades
Soporte del lenguaje
Soporte de tipos (tipos básicos, RTTI)
Macros de prueba de características de la biblioteca (C++20)
Utilidades del programa
Funciones variádicas
Soporte de corrutinas (C++20)
Soporte de contratos (C++26)
Comparación a tres vías
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilidades generales
Operadores relacionales (obsoleto en C++20)
 
Definido en el encabezado <tuple>
template< class T, class Tuple >
constexpr T make_from_tuple( Tuple&& t );
(desde C++17)
(hasta C++23)
template< class T, tuple-like Tuple >
constexpr T make_from_tuple( Tuple&& t );
(desde C++23)

Construye un objeto de tipo T, usando los elementos de la tupla t como argumentos del constructor.

Dada la función de solo exposición /*make-from-tuple-impl*/ definida de la siguiente manera:
template<class T, similar a tupla (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))...);
}

El efecto es equivalente a:
return /*make-from-tuple-impl*/<T>(
std::forward<Tuple>(t),
std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>{}
);
.

Si

  • std::tuple_size_v<std::remove_reference_t<Tuple>> es 1 y std::reference_constructs_from_temporary_v<
    T, decltype(std::get<0>(std::declval<Tuple>()))>
    es true, o
(desde C++23)
  • std::is_constructible_v<T, decltype(std::get<I>(std::declval<Tuple>()))...> es false,

el programa está mal formado.

Parámetros

t - tupla cuyos elementos se utilizarán como argumentos para el constructor de T

Valor de retorno

El objeto o referencia T construido.

Notas

Tuple no necesita ser std::tuple , y en su lugar puede ser cualquier cosa que admita std::get y std::tuple_size ; en particular, std::array y std::pair pueden usarse.

(hasta C++23)

Tuple está restringido a ser tuple-like, es decir, cada tipo en él debe ser una especialización de std::tuple u otro tipo (como std::array y std::pair ) que modele tuple-like .

(desde C++23)

Debido a la eliminación de copia garantizada , T no necesita ser movible.

Macro de prueba de características Valor Std Característica
__cpp_lib_make_from_tuple 201606L (C++17) std::make_from_tuple

Ejemplo

#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));
}

Salida:

42, 3.14, 0

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 3528 C++17 se permitía el cast que contenía reinterpret_cast etc. en el caso de tuple de 1 elemento prohibido

Véase también

(C++11)
crea un objeto tuple del tipo definido por los tipos de argumentos
(plantilla de función)
crea un tuple de referencias de reenvío
(plantilla de función)
(C++17)
llama a una función con una tupla de argumentos
(plantilla de función)