std::tie
来自 cppreference.com
定义在头文件 <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 // since C++14 std::tuple<Args&...> tie(Args&... args) noexcept { return {args...}; } |
[编辑] 备注
std::tie
可用于解包 std::pair,因为 std::tuple 具有从 pairs 到 转换赋值。
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; friend bool operator<(const S& lhs, const S& rhs) noexcept { // compares lhs.n to rhs.n, // then lhs.s to rhs.s, // then lhs.d to rhs.d // in that order, first non-equal result is returned // or false if all elements are equal return std::tie(lhs.n, lhs.s, lhs.d) < std::tie(rhs.n, rhs.s, rhs.d); } }; int main() { // Lexicographical comparison demo: std::set<S> set_of_s; S value{42, "Test", 3.14}; std::set<S>::iterator iter; bool is_inserted; // Unpack a pair: std::tie(iter, is_inserted) = set_of_s.insert(value); assert(is_inserted); // std::tie and structured bindings: auto position = [](int w) { return std::tuple(1 * w, 2 * w); }; auto [x, y] = position(1); assert(x == 1 && y == 2); std::tie(x, y) = position(2); // reuse x, y with tie assert(x == 2 && y == 4); // Implicit conversions are permitted: std::tuple<char, short> coordinates(6, 9); std::tie(x, y) = coordinates; assert(x == 6 && y == 9); }
[编辑] 另请参阅
结构化绑定 (C++17) | 将指定的名称绑定到初始化程序的子对象或元组元素 |
(C++11) |
创建由参数类型定义的类型的 tuple 对象(函数模板) |
(C++11) |
创建一个包含 转发引用 的 tuple (函数模板) |
(C++11) |
通过连接任意数量的元组来创建一个 tuple (函数模板) |
(C++11) |
占位符,用于在使用 tie 解包 tuple 时跳过元素(常量) |