我可以这么简单地说:
在函数只能返回一个变量的语言中
int a,b,c;
std::tie(a,b,c) = function_returning_multiple_values();
是一个黑客:
auto [a, b, c] = function_returning_multiple_values();
就像在 C++ 只允许函数使用一个参数的假设世界中一样
int p1, p2, p3;
p1 = ...;
p2 = ...;
p3 = ...;
function_taking_multiple_params(std::tie_params(p1, p2, p3));
将是一个黑客:
function_taking_multiple_params(p1, p2, p3)
你已经习惯了 C++ 的限制,一个函数最多只能返回一个对象,但实际上它只是一种人为的语言限制,就像最多接受一个参数的限制是一种人为的语言限制一样。
这std::tie
是一个缺少语言功能的库黑客。它有一些缺点:
- 变量需要事先声明
- 变量类型必须显式声明
- 效率低下或不能与不可默认构造的类型一起使用
结构化绑定是它们本来可以做的一切吗?不,但在大多数情况下,它们就是我们需要的一切。
什么不见了?
auto [a, std::string b, c] = foo();
在哪里推导出类型并且a
是显式的“std::string”c
b
auto [a, [b1, b2], c] = foo();
其中第二个返回的对象foo
是一个tuple
类似的对象。
- 返回站点的语言功能(
std::tuple
全部绕过):
auto foo() -> [int, int]
代替
auto foo() -> std::tuple<int, int>
auto foo() -> [int& key, int& value]
……嗯……那不是很好吗
- 并将其与...结合起来 - 为一个很酷的新名称做好准备 - 广义返回初始化:
auto minmax_element(It begin, It end) -> [It min_it, It max_it];
auto [min = *min_it, max = *max_it] = minmax_element(...);