精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
服务方向
联系方式
锐英源精品原创,禁止转载和任何形式的非法内容使用,违者必究。点名“简易百科”和“闲暇巴”盗用锐英源原创内容。
函数的多个返回值在编程中并不是一个新概念,许多其他编程语言中也存在类似的功能。C++17 附带了一项新功能(结构化绑定),该功能类似于其他语言中提供的多个返回值。
在下面的示例中,我想概述我们在旧 C++ 标准、现代标准 (C++11/14) 和现在的 C++17 中用于从函数返回多个值的一些选项:
#include <iostream> #include <tuple> // std::tie const double PI = 3.14159265; void calculateSinCos(const double param, double & resSin, double & resCos) { resSin = sin(param * PI / 180.0); // converting degrees to radians resCos = cos(param * PI / 180.0); // converting degrees to radians } std::pair<double, double> calculateSinCos(const double param) { return { sin(param * PI / 180.0), cos(param * PI / 180.0) }; } std::tuple<double, double> calculateSinCos_Tuple(const double param) { return std::make_tuple(sin(param * PI / 180.0), cos(param * PI / 180.0)); // packing values into tuple } int main() { double param { 90.0 }; double resultSin { 0.0 }; double resultCos { 0.0 }; //C++98 calculateSinCos(param, resultSin, resultCos); std::cout << "C++98 : sin(" << param << ") = " << resultSin << ", cos(" << param << ") = " << resultCos << "\n"; //C++11 const auto resSinCos(calculateSinCos(param)); std::cout << "C++11 : sin(" << param << ") = " << resSinCos.first << ", cos(" << param << ") = " << resSinCos.second << "\n"; //C++11 std::tie(resultSin, resultCos) = calculateSinCos(param); std::cout << "C++11 : sin(" << param << ") = " << resultSin << ", cos(" << param << ") = " << resultCos << "\n"; // C++17 auto[a, b] = calculateSinCos(param); std::cout << "C++17 : sin(" << param << ") = " << a << ", cos(" << param << ") = " << b << "\n"; // C++17 auto[x, y] = calculateSinCos_Tuple(param); // std::make_tuple(sin(val), cos(val)); std::cout << "C++17 : sin(" << param << ") = " << x << ", cos(" << param << ") = " << y << "\n"; }
让我们看看上面的代码:
calculateSinCos(param, resultSin, resultCos);
我们使用了最古老且可能仍然是最常见的方法 - 使用作为引用传递的 OUTPUT 参数可用于将值“返回”给调用者。
const auto resSinCos(calculateSinCos(param));
通过resSinCos.first和resSinCos.second访问std::pair结果的单个值,不是很有表现力,因为我们很容易混淆名称,而且很难阅读。
std::tie(resultSin, resultCos) = calculateSinCos(param);
此方法演示了如何将结果对解包为两个变量。请注意,这个例子展示了 的所有功能,但尽管如此,它不如结构化绑定强大,因为我们必须首先定义我们想要绑定的所有变量。std::tiestd::tie
auto[a, b] = calculateSinCos(param);
请注意,变量a 和b 不是引用;它们是生成的对象成员变量的别名(或绑定)。编译器为临时对象分配唯一名称。
C++17 修复了这个缺陷,结构化绑定允许我们编写如下代码:
auto[x, y] = calculateSinCos_Tuple(param);
auto其实是泛类型语言的标志,现在C++17大量使用auto,有好处,也有坏处,搞的像两个版本一样,当然如果直接学C++17,不学旧版本,就没有两个版本的问题。 不过C++17在泛型和STL上要求太高了,特别是对初学者。
如果std::tuple<double, double,double>是参数返回类型,auto[a,b]会提示“元素数量比绑定名称数量多”,auto语法错误编译器能够识别。
参数是3个,实际调用是2个,肯定有编译错误。