# std::tie

< cpp‎ | utility‎ | tuple

定义于头文件 `<tuple>` |  |
template< class... Types > std::tuple<Types&...> tie( Types&... args ) noexcept; |  | (C++11 起) (C++14 前)
template< class... Types > constexpr std::tuple<Types&...> tie( Types&... args ) noexcept; |  | (C++14 起)

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

### 参数

args | - | 构造 tuple 所用的零或更多左值参数

### 返回值

含左值引用的 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);

### 示例

`std::tie` 能用于引入字典序比较到结构体，或解包 tuple ：

    #include <iostream>
    #include <string>
    #include <set>
    #include <tuple>

    struct S {
        int n;
        std::string s;
        float d;
        bool operator<(const S& rhs) const
        {
            // 比较 n 与 rhs.n,
            // 然后为 s 与 rhs.s,
            // 然后为 d 与 rhs.d
            return std::tie(n, s, d) < std::tie(rhs.n, rhs.s, rhs.d);
        }
    };

    int main()
    {
        std::set<S> set_of_s; // S 为可比较小于 (LessThanComparable)

        S value{42, "Test", 3.14};
        std::set<S>::iterator iter;
        bool inserted;

        // 解包 insert 的返回值为 iter 与 inserted
        std::tie(iter, inserted) = set_of_s.insert(value);

        if (inserted)
            std::cout << "Value was inserted successfully\n";
    }

输出：

    Value was inserted successfully

### 参阅

结构化绑定 (C++17) | 绑定指定的名字到初始化器的子对象或元组元素
make_tuple | 创建一个 `tuple` 对象，其类型根据各实参类型定义 (函数模板)
forward_as_tuple | 创建转发引用的 `tuple` (函数模板)
tuple_cat | 通过连接任意数量的元组来创建一个`tuple` (函数模板)
ignore | 用 `tie` 解包 `tuple` 时用来跳过元素的占位符 (常量)