std::tie

来自cppreference.com
< cpp‎ | utility‎ | tuple
 
 
 
 
在标头 <tuple> 定义
template<class... Types>
std::tuple<Types&...> tie( Types&... args)noexcept;
(C++11 起)
(C++14 起为 constexpr)

创建到其实参或 std::ignore 实例的左值引用的元组。

目录

[编辑]参数

args - 为之构造元组的零或更多左值实参

[编辑]返回值

含左值引用的 std::tuple 对象。

[编辑]可能的实现

template<typename... Args>constexpr// C++14 起std::tuple<Args&...> tie(Args&... args)noexcept{return{args...};}

[编辑]注解

std::tie 可用于解包 std::pair,因为 std::tuple 拥有从 pair 的转换赋值

bool result; std::tie(std::ignore, result)= set.insert(value);

[编辑]示例

1) std::tie 可以用于为结构体引入字典序比较,或解包元组;
2) std::tie 可以用于结构化绑定

#include <cassert>#include <iostream>#include <set>#include <string>#include <tuple>   struct S {int n;std::string s;float d;   friendbool operator<(const S& lhs, const S& rhs)noexcept{// 比较 lhs.n 与 rhs.n,// 然后为 lhs.s 与 rhs.s,// 然后为 lhs.d 与 rhs.d// 返回这个次序中第一个不相等的结果// 或者当所有元素都相等时返回 falsereturn std::tie(lhs.n, lhs.s, lhs.d)< std::tie(rhs.n, rhs.s, rhs.d);}};   int main(){// 字典序比较演示:std::set<S> set_of_s;   S value{42, "Test", 3.14};std::set<S>::iterator iter;bool is_inserted;   // 解包 pair: std::tie(iter, is_inserted)= set_of_s.insert(value);assert(is_inserted);     // std::tie 和结构化绑定:auto position =[](int w){returnstd::tuple(1* w, 2* w);};   auto[x, y]= position(1);assert(x ==1&& y ==2); std::tie(x, y)= position(2);// 用 tie 重用 x, yassert(x ==2&& y ==4);     // 允许隐式转换:std::tuple<char, short> coordinates(6, 9); std::tie(x, y)= coordinates;assert(x ==6&& y ==9);   // 忽略部分变量:std::string z; std::tie(x, std::ignore, z)=std::make_tuple(1, 2.0, "Test");assert(x ==1&& z.compare("Test")==0);   // 跳过一个元素:std::string z; std::tie(x, std::ignore, z)=std::tuple(1, 2.0, "Test");assert(x ==1&& z =="Test");}

[编辑] 参阅

结构化绑定(C++17) 绑定指定的名字到初始化式的子对象或元组元素[编辑]
(C++11)
创建一个 tuple 对象,其类型根据各实参类型定义
(函数模板)[编辑]
创建转发引用tuple
(函数模板)[编辑]
(C++11)
通过连接任意数量的元组来创建一个tuple
(函数模板)[编辑]
(C++11)
tie 解包 tuple 时用来跳过元素的占位符
(常量)[编辑]
close