Namespaces
Variants

std:: tuple_cat

From cppreference.net
Utilities library
Défini dans l'en-tête <tuple>
template < class ... Tuples >
std:: tuple < /* CTypes */ ... > tuple_cat ( Tuples && ... args ) ;
(depuis C++11)
(jusqu'à C++14)
template < class ... Tuples >
constexpr std:: tuple < /* CTypes */ ... > tuple_cat ( Tuples && ... args ) ;
(depuis C++14)
(jusqu'à C++23)
template < tuple - like... Tuples >
constexpr std:: tuple < /* CTypes */ ... > tuple_cat ( Tuples && ... args ) ;
(depuis C++23)

Construit un tuple qui est une concaténation de tous les tuples dans args . Les types d'éléments /* CTypes */ du tuple retourné sont formés en concaténant les packs de types d'éléments de tous les types std::tuple (jusqu'à C++23) tuple-like (depuis C++23) dans Tuples dans l'ordre.

Le comportement n'est pas défini si un type dans std:: decay_t < Tuples > ... n'est pas une spécialisation de std::tuple . Cependant, une implémentation peut choisir de supporter les types (tels que std::array et std::pair ) qui suivent le protocole tuple-like.

(jusqu'à C++23)

Les types std:: decay_t < Tuples > ... sont contraints à être tuple-like, c'est-à-dire que chaque type doit être une spécialisation de std::tuple ou un autre type (tel que std::array et std::pair ) qui modélise tuple-like .

(depuis C++23)

Si un type dans /* CTypes */ n'est pas constructible à partir du type de l'élément correspondant dans la séquence d'éléments concaténés à partir de args , le comportement est indéfini (jusqu'à C++23) le programme est mal formé (depuis C++23) .

Table des matières

Paramètres

args - zéro ou plusieurs tuples à concaténer

Valeur de retour

Un objet std::tuple composé de tous les éléments de tous les tuples d'arguments construit à partir de std :: get < j > ( std:: forward < Ti > ( arg ) ) pour chaque élément individuel.

Exemple

#include <iostream>
#include <string>
#include <tuple>
// fonction d'aide pour afficher un tuple de n'importe quelle taille
template<class Tuple, std::size_t N>
struct TuplePrinter
{
    static void print(const Tuple& t)
    {
        TuplePrinter<Tuple, N - 1>::print(t);
        std::cout << ", " << std::get<N-1>(t);
    }
};
template<class Tuple>
struct TuplePrinter<Tuple, 1>
{
    static void print(const Tuple& t)
    {
        std::cout << std::get<0>(t);
    }
};
template<typename... Args, std::enable_if_t<sizeof...(Args) == 0, int> = 0>
void print(const std::tuple<Args...>& t)
{
    std::cout << "()\n";
}
template<typename... Args, std::enable_if_t<sizeof...(Args) != 0, int> = 0>
void print(const std::tuple<Args...>& t)
{
    std::cout << "(";
    TuplePrinter<decltype(t), sizeof...(Args)>::print(t);
    std::cout << ")\n";
}
// fin de la fonction d'aide
int main()
{
    std::tuple<int, std::string, float> t1(10, "Test", 3.14);
    int n = 7;
    auto t2 = std::tuple_cat(t1, std::make_tuple("Foo", "bar"), t1, std::tie(n));
    n = 42;
    print(t2);
}

Sortie :

(10, Test, 3.14, Foo, bar, 10, Test, 3.14, 42)

Voir aussi

(C++11)
crée un objet tuple du type défini par les types d'arguments
(modèle de fonction)
(C++11)
crée un tuple de références lvalue ou décompose un tuple en objets individuels
(modèle de fonction)
crée un tuple de références de transfert
(modèle de fonction)