C++函数返回多种类型的值
时间: 2025-02-10 07:08:40 浏览: 33
### 实现 C++ 函数返回多种类型的几种方法
#### 使用 `std::variant`
`std::variant` 是一种安全的方式来表示多个可能的类型之一。通过这种方式可以定义一个函数,该函数能够返回不同类型的值。
```cpp
#include <iostream>
#include <variant>
using MyVariant = std::variant<int, double, std::string>;
MyVariant get_value(int choice) {
switch (choice) {
case 0: return int{42};
case 1: return double{3.14};
default: return std::string{"hello"};
}
}
void print(const MyVariant& v) {
std::visit([](auto&& arg){
std::cout << arg << "\n";
}, v);
}
```
此代码展示了如何创建并操作可变体对象[^1]。
#### 利用 `std::any`
当事先不知道具体要处理哪些数据类型时,可以选择更为通用但也更不安全的方法——即使用 `std::any`. 这种方式允许存储任何类型的单个实例,并且可以在运行时查询其实际类型。
```cpp
#include <iostream>
#include <any>
std::any get_any() {
if (...) { // some condition
return "a string";
} else {
return 42;
}
}
int main() {
auto val = get_any();
try {
if(val.type() == typeid(std::string)) {
std::cout << std::any_cast<std::string>(val) << '\n';
} else if(val.type() == typeid(int)){
std::cout << std::any_cast<int>(val) << '\n';
}
} catch(const std::bad_any_cast&) {
std::cerr << "Type mismatch\n";
}
return 0;
}
```
这段程序说明了怎样利用 `std::any` 来封装任意类型的变量,在调用者端则需负责正确地解包这些值.
#### 结合模板与 `std::tuple`
对于固定数量的不同类型组合的情况,还可以考虑采用模板配合元组的形式:
```cpp
template<typename... Args>
class MultiReturn {
private:
std::tuple<Args...> data;
public:
explicit MultiReturn(Args... args):data(args...) {}
template<size_t N>
decltype(auto) get() const noexcept{
static_assert(N < sizeof...(Args), "Index out of bounds");
return std::get<N>(data);
}
};
// Usage example
MultiReturn<int, float, char> multi_func(){
return MultiReturn<int,float,char>{1, 2.7f,'c'};
}
```
上述例子中定义了一个名为 `MultiReturn` 的类模板,它接受不定参数列表作为构造器输入,并将其保存在一个内部 tuple 中;之后可以通过索引来获取对应的成员项.
阅读全文
相关推荐


















