C++ 如何在一个方法中返回多个不同类型的数据
使用输出参数
最简单,最传统的方式就是使用引用或指针作为输出参数,如下代码所示:
void getMultipleValues(int& num, std::string& str, double& val) {num = 42;str = "Hello";val = 3.14;
}int main() {int n;std::string s;double d;getMultipleValues(n, s, d);return 0;
}
这种方法要设置参数类型,略显麻烦(不过C语言要实现类似的需求,还是以此方法为主)。
定义结构体
struct Result {int number;std::string text;double value;
};Result getStructuredData() {return {42, "Hello", 3.14};
}int main() {auto result = getStructuredData();int n = result.number;std::string s = result.text;double d = result.value;return 0;
}
这种方法就更麻烦了,不过要返回很多数据时,这个方法能更清晰的表意。
使用tuple
#include <tuple>
#include <string>std::tuple<int, std::string, double> getMultipleValues() {return {42, "Hello", 3.14};
}int main() {// 使用结构化绑定解构auto [num, str, val] = getMultipleValues();// 或者使用 std::get 访问auto t = getMultipleValues();int n = std::get<0>(t);std::string s = std::get<1>(t);double d = std::get<2>(t);return 0;
}
这种方法我认为是最简单,最直观的,而且你也可以显示忽略掉某个值:
auto [num, _, __] = getMultipleValues();
auto [_, str, ___] = getMultipleValues();
_ 是常用的占位符(只是命名习惯,任何未使用的变量名都可以)。占位符变量不会分配存储空间,编译器会优化掉未使用的部分。
如果你需要将值绑定到已有变量,可以使用std::tie:
int n;
std::string s;
std::tie(n, s, std::ignore) = getMultipleValues();
根据条件确定返回值
#include <variant>
#include <string>std::variant<int, std::string> getDynamicValue(bool condition) {if (condition) return 42;return "Hello";
}int main() {auto v = getDynamicValue(true);if (std::holds_alternative<int>(v)) {int n = std::get<int>(v);} else {std::string s = std::get<std::string>(v);}return 0;
}
std::holds_alternative(v)这个方法用于检查 std::variant 对象当前是否持有特定类型的值。
你也可以用get_if方法来替代上述方法(这个方法更简洁,更直观):
if (auto ptr = std::get_if<int>(&v)) {std::cout << "Holds int: " << *ptr << std::endl;
}