std::tuple_size în C++

Dă, la compilare, numărul de elemente dintr-un tip tuple, pair sau std::array.

Sintaxă
template<class T>
struct tuple_size;            // tuple_size<T>::value

template<class T>
constexpr std::size_t tuple_size_v = tuple_size<T>::value;   // C++17

Ce face std::tuple_size

std::tuple_size<T>::value (sau, mai scurt, std::tuple_size_v<T>) este numărul de elemente al tipului T: un tuplu, o pereche (mereu 2) sau un std::array (N). Valoarea este o constantă de compilare, deci o poți folosi în static_assert, if constexpr sau ca dimensiune de tablou.

Primește un tip, nu un obiect. Pentru o variabilă, scrie std::tuple_size_v<decltype(t)>.

Parametri

Parametru Descriere
T Tipul (tuplu, pereche sau std::array).

Ce returnează

O constantă std::size_t.

Exemple

Exemplul 1: Numărul de elemente la compilare

#include <array>
#include <print>
#include <string>
#include <tuple>
#include <utility>

int main() {
    std::tuple<std::string, int, double, bool> rand{"Ana", 30, 1.68, true};
    std::array<int, 5> zile{};

    std::println("tuple: {}", std::tuple_size_v<decltype(rand)>);
    std::println("pair:  {}", std::tuple_size_v<std::pair<int, int>>);
    std::println("array: {}", std::tuple_size<decltype(zile)>::value);

    static_assert(std::tuple_size_v<decltype(rand)> == 4, "rândul trebuie să aibă 4 coloane");
}

Rezultat

tuple: 4
pair:  2
array: 5

Greșeli frecvente

  • Scrii std::tuple_size_v<t> cu numele variabilei: nu compilează, este nevoie de tip. Folosește decltype(t).
  • Aplici pe un tip referință (decltype al unui parametru const auto&). Elimină întâi referința cu std::remove_cvref_t.

Comenzi înrudite

  • std::tuple: Grupează oricâte valori de tipuri diferite într-un singur obiect; generalizarea lui std::pair.
  • std::get: Citește elementul unui tuplu, al unei perechi sau al unui std::array după poziție (sau după tip), la compilare.
  • std::apply: Apelează o funcție dând ca argumente, pe rând, elementele unui tuplu (sau ale unei perechi, ale unui std::array).
  • std::array: Tablou cu dimensiune fixă, cunoscută la compilare, cu interfața unui container (size, at, begin, end).