标准库头文件 <tuple>

来自cppreference.com
< cpp‎ | header
 
 
 

此头文件是通用工具库的一部分。

(C++11)
实现固定大小的容器,它保有类型可以相异的元素
(类模板)
在编译时获得 tuple 的大小
(类模板特化)
获得指定元素的类型
(类模板特化)
特化 std::uses_allocator 类型特征
(类模板特化)

常量

tie 解包 tuple 时用来跳过元素的占位符
(常量)

函数

创建一个 tuple 对象,其类型根据各实参类型定义
(函数模板)
创建左值引用的 tuple,或将 tuple 解包为独立对象
(函数模板)
创建转发引用tuple
(函数模板)
通过连接任意数量的元组来创建一个tuple
(函数模板)
元组式访问指定的元素
(函数模板)
按字典顺序比较 tuple 中的值
(函数模板)
特化 std::swap 算法
(函数模板)
(C++17)
以一个实参的元组来调用函数
(函数模板)
以一个实参元组构造对象
(函数模板)

概要

namespace std {
    // 类模板 tuple:
    template <class... Types> class tuple;
 
    // tuple 创建函数
    inline constexpr /* 未指明 */ ignore;
    template <class... Types>
        constexpr tuple<VTypes...> make_tuple(Types&&...);
    template <class... Types>
        constexpr tuple<Types...> forward_as_tuple(Types&&...) noexcept;
    template<class... Types>
        constexpr tuple<Types&...> tie(Types&...) noexcept;
    template <class... Tuples>
        constexpr tuple<CTypes...> tuple_cat(Tuples&&...);
 
    // 以实参 tuple 调用函数
    template <class F, class Tuple>
    constexpr decltype(auto) apply(F&& f, Tuple&& t);
 
    template <class T, class Tuple>
    constexpr T make_from_tuple(Tuple&& t);
 
    // tuple 辅助类:
    template <class T> class tuple_size; // 未予定义
    template <class T> class tuple_size<const T>;
    template <class T> class tuple_size<volatile T>;
    template <class T> class tuple_size<const volatile T>;
    template <class... Types> class tuple_size<tuple<Types...> >;
 
    template <size_t I,  class   T>     class tuple_element; // 未予定义
    template <size_t I,  class   T>     class tuple_element<I, const T>;
    template <size_t I,  class   T>     class tuple_element<I, volatile T>;
    template <size_t I,  class   T>     class tuple_element<I, const volatile T>;
    template <size_t I, class... Types> class tuple_element<I, tuple<Types...> >;
 
    // 元素访问:
    template <size_t I, class... Types>
    constexpr tuple_element_t<I, tuple<Types...>>&
      get(tuple<Types...>&) noexcept;
    template <size_t I, class... Types>
    constexpr tuple_element_t<I, tuple<Types...>>&&
      get(tuple<Types...>&&) noexcept;
    template <size_t I, class... Types>
    constexpr const tuple_element_t<I, tuple<Types...>>&
      get(const tuple<Types...>&) noexcept;
    template <size_t I, class... Types>
    constexpr const tuple_element_t<I, tuple<Types...>>&& 
      get(const tuple<Types...>&&) noexcept;
    template <class T, class... Types>
      constexpr T& get(tuple<Types...>& t) noexcept;
    template <class T, class... Types>
      constexpr T&& get(tuple<Types...>&& t) noexcept;
    template <class T, class... Types>
      constexpr const T& get(const tuple<Types...>& t) noexcept;
    template <class T, class... Types>
      constexpr const T&& get(const tuple<Types...>&& t) noexcept;
 
    // 关系运算符:
    template<class... TTypes, class... UTypes>
        constexpr bool operator==(const tuple<TTypes...>&, const tuple<UTypes...>&);
    template<class... TTypes, class... UTypes>
        constexpr bool operator<(const tuple<TTypes...>&, const tuple<UTypes...>&);
    template<class... TTypes, class... UTypes>
        constexpr bool operator!=(const tuple<TTypes...>&, const tuple<UTypes...>&);
    template<class... TTypes, class... UTypes>
        constexpr bool operator>(const tuple<TTypes...>&, const tuple<UTypes...>&);
    template<class... TTypes, class... UTypes>
        constexpr bool operator<=(const tuple<TTypes...>&, const tuple<UTypes...>&);
    template<class... TTypes, class... UTypes>
        constexpr bool operator>=(const tuple<TTypes...>&, const tuple<UTypes...>&);
 
    // 分配器相关特征
    template <class... Types, class Alloc>
        struct uses_allocator<tuple<Types...>, Alloc>;
    // 特化的算法:
    template <class... Types>
        constexpr void swap(tuple<Types...>& x, tuple<Types...>& y) noexcept(x.swap(y));
    // tuple 辅助类
    template <class T> constexpr size_t tuple_size_v = tuple_size<T>::value;
}

std::tuple

template <class... Types>
class tuple {
public:
  // tuple 构造
  /* 条件性-explicit */ constexpr tuple();
  // 仅当 sizeof...(Types) >= 1
  /* 条件性-explicit */ constexpr tuple(const Types&...); 
  // 仅当 sizeof...(Types) >= 1
  template <class... UTypes>
  /* 条件性-explicit */ constexpr tuple(UTypes&&...); 
  tuple(const tuple&) = default;
  tuple(tuple&&) = default;
  template <class... UTypes>
  /* 条件性-explicit */ constexpr tuple(const tuple<UTypes...>&);
  template <class... UTypes>
  /* 条件性-explicit */ constexpr tuple(tuple<UTypes...>&&);
  // 仅当 sizeof...(Types) == 2
  template <class U1, class U2>
  /* 条件性-explicit */ constexpr tuple(const pair<U1, U2>&);
  // 仅当 sizeof...(Types) == 2
  template <class U1, class U2>
  /* 条件性-explicit */ constexpr tuple(pair<U1, U2>&&); 
 
  // 分配器扩展构造函数
  template <class Alloc>
  constexpr tuple(allocator_arg_t, const Alloc& a);
  template <class Alloc>
  /* 条件性-explicit */ constexpr
  tuple(allocator_arg_t, const Alloc& a, const Types&...);
  template <class Alloc, class... UTypes>
  /* 条件性-explicit */ constexpr
  tuple(allocator_arg_t, const Alloc& a, UTypes&&...);
  template <class Alloc>
  constexpr tuple(allocator_arg_t, const Alloc& a, const tuple&);
  template <class Alloc>
  constexpr tuple(allocator_arg_t, const Alloc& a, tuple&&);
  template <class Alloc, class... UTypes>
  /* 条件性-explicit */ constexpr
  tuple(allocator_arg_t, const Alloc& a, const tuple<UTypes...>&);
  template <class Alloc, class... UTypes>
  /* 条件性-explicit */ constexpr
  tuple(allocator_arg_t, const Alloc& a, tuple<UTypes...>&&);
  template <class Alloc, class U1, class U2>
  /* 条件性-explicit */ constexpr
  tuple(allocator_arg_t, const Alloc& a, const pair<U1, U2>&);
  template <class Alloc, class U1, class U2>
  /* 条件性-explicit */ constexpr
  tuple(allocator_arg_t, const Alloc& a, pair<U1, U2>&&);
 
  // tuple 赋值
  constexpr tuple& operator=(const tuple&);
  constexpr tuple& operator=(tuple&&) noexcept(see below );
  template <class... UTypes>
  constexpr tuple& operator=(const tuple<UTypes...>&);
  template <class... UTypes>
  constexpr tuple& operator=(tuple<UTypes...>&&);
  template <class U1, class U2>
  constexpr tuple& operator=(const pair<U1, U2>&); // 仅当 sizeof...(Types) == 2
  template <class U1, class U2>
  constexpr tuple& operator=(pair<U1, U2>&&); // 仅当 sizeof...(Types) == 2
 
  // tuple 交换
  constexpr void swap(tuple&) noexcept(/* 条件性 */);
};