--- title: "tuple" --- {{< callout type="info">}} Header: `tuple.h` Since: `20.41.0` Similar to: `std::tuple` {{< /callout >}} A fixed-size collection of heterogeneous values. Adds additional functionality to std::tuple. ```cpp etl::tuple ``` ## Template deduction guides C++17 and above. **Template deduction guide from variadic arguments.** ```cpp template tuple(TArgs... args) -> tuple; ``` **Template deduction guide from pair.** ```cpp template tuple(ETL_OR_STD::pair) -> tuple; ``` **Example** ```cpp etl::tuple tp(1, 2.2, 3, std::string("4")); ``` Equivalent to: ```cpp etl::tuple t(1, 2.2, 3, std::string("4")); ``` ## Make tuple ```cpp template ETL_NODISCARD ETL_CONSTEXPR14 etl::tuple...> make_tuple(Types&&... args) ``` **Example** ```cpp auto t = etl::make_tuple(1, 2.2, 3, std::string("4")); ``` Equivalent to: ```cpp etl::tuple t(1, 2.2, 3, std::string("4")); ``` --- ## Member types `value_type`   The first type contained by this tuple. `this_type`   The type of this tuple. `base_type`   The type of the base tuple to this tuple. This is a tuple of all types except for the first. `index_sequence_type`   The index_sequence type for this tuple. ## Constructor Default or copy constructs each element. Can be initialised like a C array. ```cpp etl::array data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; --- ### Access ```cpp template etl::tuple_element; ``` ## Capacity ```cpp template struct tuple_size; ``` ## ETL Extensions ```cpp template struct is_tuple ``` If `T` is a `tuple` then `etl::is_tuple` is defined as `etl::true_type`, otherwise `etl::false_type`. ### Specialisations of STL to allow the use of C++ structured bindings. ```cpp template struct tuple_size> ``` Specialisation of tuple_size to allow the use of C++ structured bindings. Declared in namespace `std`. ```cpp template struct tuple_element> ``` Specialisation of `tuple_element` to allow the use of C++ structured bindings. Declared in namespace `std`. ### Convert an `etl::tuple` to a `std::tuple` ```cpp template ETL_NODISCARD ETL_CONSTEXPR14 auto to_std(const etl::tuple& etl_tuple) ``` Converts an `etl::tuple` to a `std::tuple`. Enabled when STL is available. --- ```cpp template ETL_NODISCARD ETL_CONSTEXPR14 auto to_std(etl::tuple&& etl_tuple) ``` Converts an `etl::tuple` to a `std::tuple`. Enabled when STL is available. ### Convert an std::tuple to a etl::tuple ```cpp template ETL_NODISCARD ETL_CONSTEXPR14 auto to_etl(const std::tuple& std_tuple) ``` Converts a `std::tuple` to an `etl::tuple`. Enabled when STL is available. --- ```cpp template ETL_NODISCARD ETL_CONSTEXPR14 auto to_etl(std::tuple&& std_tuple) ``` Converts a `std::tuple` to an `etl::tuple`. Enabled when STL is available. ### Create a tuple from selected elements of another ```cpp template ETL_NODISCARD ETL_CONSTEXPR14 auto select_from_tuple(Tuple&& tuple, etl::index_sequence) ``` Creates a new tuple by selecting elements from another, given a run time index sequence. Static asserts if the number of indices does not match the tuple size. --- ```cpp template ETL_NODISCARD ETL_CONSTEXPR14 auto select_from_tuple(Tuple&& tuple) ``` Creates a new tuple by selecting elements from another, given a template parameter index sequence. Static asserts if the number of indices does not match the tuple size. ## Non-member functions ```cpp template ETL_CONSTEXPR14 etl::tuple_element_t>& get(tuple&); ``` --- ```cpp template ETL_CONSTEXPR14 etl::tuple_element_t>&& get(tuple&&); ``` --- ```cpp template ETL_CONSTEXPR14 const etl::tuple_element_t>& get(const tuple&); ``` --- ```cpp template ETL_CONSTEXPR14 const etl::tuple_element_t>&& get(const tuple&&); ``` --- ```cpp template ETL_CONSTEXPR14 T& get(tuple&); ``` --- ```cpp template ETL_CONSTEXPR14 T&& get(tuple&&); ``` --- ```cpp template ETL_CONSTEXPR14 const T& get(const tuple&); ``` --- ```cpp template ETL_CONSTEXPR14 const T&& get(const tuple&&); ```