在Go中,一个函数可以返回多个值。许多标准库中的函数返回2个值,一个是期望得到的返回值,另一个是函数出错时的错误信息。比如下面是一个Go打开文件的常用写法
file, err := os.Open(dataFile)
if err != nil {
// error handle
}
函数返回多个值简洁明了,错误信息显示表达。不像C语言API,比如recv返回-1隐示表示发生了某种错误。
C++在语法层面规定函数最多只能有一个返回值,一般要返回多个值时,采用如下两种做法:
- 返回一个pair或结构体
- 出参返回,使用引用或指针
这两种做法都不够直观,其实在C++17语言中,我们可以使用返回tuple和decomposition declarations语法来模拟Go语言函数多返回值功能。如下所示:
#include <iostream>
#include <tuple>
#include <string>
std::tuple<std::string, bool> foo()
{
return std::make_tuple("hello", true);
}
int main()
{
auto [value, exists] = foo();
if (exists) {
std::cout << value << std::endl;
}
return 0;
}
虽然可能还是比不上Go直观,但基本上已经够清晰的了,只是编译的时候要加上-std=c++17。
网友评论