标准库标头 <tuple> (C++11)
来自cppreference.com
此头文件是通用工具库的一部分。
包含 | |
(C++20) |
三路比较运算符支持 |
类 | |
(C++11) |
实现固定大小的容器,可保有类型相异的元素 (类模板) |
(C++11) |
获得元组式类型的元素数量 (类模板) |
(C++11) |
获得元组式类型的元素类型 (类模板) |
(C++11) |
获得 tuple 的大小 (类模板特化) |
| 获得指定元素的类型 (类模板特化) | |
| 特化 std::uses_allocator 类型特征 (类模板特化) | |
常量 | |
(C++11) |
用 tie 解包 tuple 时用来跳过元素的占位符 (常量) |
函数 | |
(C++11) |
创建一个 tuple 对象,其类型根据各实参类型定义 (函数模板) |
(C++11) |
创建左值引用的 std::tuple,或将元组解包为独立对象 (函数模板) |
(C++11) |
创建转发引用的 tuple (函数模板) |
(C++11) |
通过连接任意数量的元组来创建一个tuple (函数模板) |
(C++11) |
元组式访问指定的元素 (函数模板) |
(C++20 移除)(C++20 移除)(C++20 移除)(C++20 移除)(C++20 移除)(C++20) |
按字典顺序比较 tuple 中的值 (函数模板) |
(C++11) |
特化 std::swap 算法 (函数模板) |
(C++17) |
以一个实参的元组来调用函数 (函数模板) |
(C++17) |
以一个实参元组构造对象 (函数模板) |
概要
#include <compare>
namespace std {
// 类模板 tuple
template<class... Types>
class tuple;
// tuple 创建函数
inline constexpr /* 未指定 */ ignore;
template<class... TTypes>
constexpr tuple<unwrap_ref_decay_t<TTypes>...> make_tuple(TTypes&&...);
template<class... TTypes>
constexpr tuple<TTypes&&...> forward_as_tuple(TTypes&&...) noexcept;
template<class... TTypes>
constexpr tuple<TTypes&...> tie(TTypes&...) 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> struct tuple_size; // 不定义
template<class T> struct tuple_size<const T>;
template<class... Types> struct tuple_size<tuple<Types...>>;
template<size_t I, class T> struct tuple_element; // 不定义
template<size_t I, class T> struct tuple_element<I, const T>;
template<size_t I, class... Types>
struct tuple_element<I, tuple<Types...>>;
template<size_t I, class T>
using tuple_element_t = typename tuple_element<I, T>::type;
// 元素访问
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 common_comparison_category_t</*synth-three-way-result*/<TTypes, UTypes>...>
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(/* 见描述 */);
// tuple 辅助类
template<class T>
inline constexpr size_t tuple_size_v = tuple_size<T>::value;
}
// 弃用
namespace std {
template<class T> class tuple_size<volatile T>;
template<class T> class tuple_size<const volatile 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>;
}
类模板 std::tuple
namespace std {
template<class... Types>
class tuple {
public:
// tuple 创建
constexpr explicit(/* 见描述 */) tuple();
constexpr explicit(/* 见描述 */)
tuple(const Types&...); // 仅若 sizeof...(Types) >= 1
template<class... UTypes>
constexpr explicit(/* 见描述 */)
tuple(UTypes&&...); // 仅若 sizeof...(Types) >= 1
tuple(const tuple&) = default;
tuple(tuple&&) = default;
template<class... UTypes>
constexpr explicit(/* 见描述 */) tuple(const tuple<UTypes...>&);
template<class... UTypes>
constexpr explicit(/* 见描述 */) tuple(tuple<UTypes...>&&);
template<class U1, class U2>
constexpr explicit(/* 见描述 */)
tuple(const pair<U1, U2>&); // 仅若 sizeof...(Types) == 2
template<class U1, class U2>
constexpr explicit(/* 见描述 */)
tuple(pair<U1, U2>&&); // 仅若 sizeof...(Types) == 2
// allocator-extended constructors
template<class Alloc>
constexpr explicit(/* 见描述 */)
tuple(allocator_arg_t, const Alloc& a);
template<class Alloc>
constexpr explicit(/* 见描述 */)
tuple(allocator_arg_t, const Alloc& a, const Types&...);
template<class Alloc, class... UTypes>
constexpr explicit(/* 见描述 */)
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>
constexpr explicit(/* 见描述 */)
tuple(allocator_arg_t, const Alloc& a, const tuple<UTypes...>&);
template<class Alloc, class... UTypes>
constexpr explicit(/* 见描述 */)
tuple(allocator_arg_t, const Alloc& a, tuple<UTypes...>&&);
template<class Alloc, class U1, class U2>
constexpr explicit(/* 见描述 */)
tuple(allocator_arg_t, const Alloc& a, const pair<U1, U2>&);
template<class Alloc, class U1, class U2>
constexpr explicit(/* 见描述 */)
tuple(allocator_arg_t, const Alloc& a, pair<U1, U2>&&);
// tuple 赋值
constexpr tuple& operator=(const tuple&);
constexpr tuple& operator=(tuple&&) noexcept(/* 见描述 */);
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(/* 见描述 */);
};
template<class... UTypes>
tuple(UTypes...) -> tuple<UTypes...>;
template<class T1, class T2>
tuple(pair<T1, T2>) -> tuple<T1, T2>;
template<class Alloc, class... UTypes>
tuple(allocator_arg_t, Alloc, UTypes...) -> tuple<UTypes...>;
template<class Alloc, class T1, class T2>
tuple(allocator_arg_t, Alloc, pair<T1, T2>) -> tuple<T1, T2>;
template<class Alloc, class... UTypes>
tuple(allocator_arg_t, Alloc, tuple<UTypes...>) -> tuple<UTypes...>;
}