对于复杂的应用程序,具有不仅仅返回一个值的函数通常很方便。从C ++使用结构到利用最新的C ++ 11元组类模板,有很多不同的方法可以用C ++实现。
![107324f569b2e36adbdeb9a8681d4c10.png](https://img-blog.csdnimg.cn/img_convert/107324f569b2e36adbdeb9a8681d4c10.png)
在很多情况下,返回对象的明显选择似乎有些过大。首先,您需要声明结构。很少有这种结构需要供消费者使用,因此您必须将其公开给外界。实例的构建也是没人喜欢进行的另一种仪式活动。
幸运的是,如果该函数仅返回两个值,则可以使用std :: pair。最有可能的,make_pair将被用来构建对。可以分别使用first和访问该对中的每个元素second。在以下示例中对此进行了说明:
std::pair<:string int> findPerson() { return std::make_pair("Joe Sixpack", 42);}int main(int, char**) { std::pair< std::string, int> person = findPerson(); std::cout < < "Name: " << person.first << std::endl; std::cout << "Age: " << person.second << std::endl; return 0;}
如果您需要两个以上的值怎么办?好吧,显然std::pair不适合这份工作。在这种情况下,我们可以利用Boost Tuple库中的boost:tuple。
![9c0ad41ddcc3e7d702b78be9187335eb.png](https://img-blog.csdnimg.cn/img_convert/9c0ad41ddcc3e7d702b78be9187335eb.png)
如果您已经在使用std::pair,很容易熟悉boost::tuple。可以使用创建元组,使用make_tuple来访问其元素get,其中n表示元素索引。
#include boost::tuple<:string std::string int> findPerson() { return boost::make_tuple("Joe", "Sixpack", 42);}int main(int, char**) { boost::tuple< std::string , std::string, int> person = findPerson(); std::cout < < "Name: " << person.get< 0>() < < " " << person.get< 1>() < < std::endl; std::cout << "Age: " << person.get< 2>() < < std::endl; return 0;}
使用最新的C ++ 11,因为std :: tuple已经可用,所以不再需要依赖第三方库。稍作调整,前面的Boost示例将在C ++中显示。
![7e2b1a0e917ffc1b4b479645ab09cfb2.gif](https://img-blog.csdnimg.cn/img_convert/7e2b1a0e917ffc1b4b479645ab09cfb2.gif)
还要注意使用use auto,可以避免不必要的冗长。编译器知道的返回类型,findPerson不再需要冗长的类型声明。
#includestd::tuple<:string>findPerson() {returnstd::make_tuple("Joe","Sixpack",42);}intmain(int,char**) {autoperson=findPerson();std::cout<(person)<(person)<<:endl>(person)<<:endl>
![8bc4aa2247b856409abfa3638b8c4069.png](https://img-blog.csdnimg.cn/img_convert/8bc4aa2247b856409abfa3638b8c4069.png)
当我们讨论它时,不妨提及std :: tie,它对轻松拆开元组很有用。这是使用进行元素访问的便捷替代方法get。下面的代码片段演示了其用法。
intmain(int,char**) {std::stringfirst_name,last_name;intage;std::tie(first_name,last_name,age)=findPerson();std::cout<