std::any存储
时间: 2024-09-24 10:13:41 浏览: 27
`std::any` 是 C++17 引入的一个用于存储任意类型对象的容器。它允许你在运行时动态地存储不同类型的数据,类似于 C 语言中的 `void*`,但提供了更强的安全性。下面是一个简单的示例:
```cpp
#include <any>
// 存储不同类型的值
std::any a;
a = "Hello"; // 储存字符串
a = 123; // 储存整数
// 安全地访问存储的值
if (auto str = std::any_cast<std::string>(a); str != nullptr) {
std::cout << "String value: " << str << '\n';
}
if (auto num = std::any_cast<int>(a); num != nullptr) {
std::cout << "Integer value: " << *num << '\n';
}
```
在这个例子中,`std::any_cast` 用来尝试将 `std::any` 中的内容转换成特定的类型。如果转换成功,则返回指向该类型数据的指针;如果转换失败(即存储的不是指定类型),则返回 `nullptr` 并抛出异常。
相关问题
std::any存储在std::vector中
尽管`std::any`本身不是一个容器,但你可以将它存储在`std::vector`或其他容器中,因为它支持复制。这里是一个简单的示例说明如何在`std::vector`中存储和访问`std::any`对象:
```cpp
#include <iostream>
#include <vector>
#include <any>
namespace std {
class any;
} // namespace std
int main() {
// 创建一个std::vector来存储std::any对象
std::vector<std::any> vec;
// 存储不同类型的数据
vec.push_back(std::any(42)); // 储存整数
vec.push_back(std::any("Hello")); // 储存字符串
// 访问并转换数据
for (const auto& a : vec) {
if constexpr (std::is_same_v<decltype(a), int>) {
int value = std::any_cast<int>(a);
std::cout << "Integer value: " << value << '\n'; // 输出整数值
}
else if constexpr (std::is_same_v<decltype(a), std::string>) {
const std::string* str = std::any_cast<const std::string*>(a);
std::cout << "String value: " << *str << '\n'; // 输出字符串值
}
}
return 0;
}
```
在这个例子中,我们首先创建了一个`std::vector<std::any>`,然后添加了一些不同类型的值(整数和字符串)。在循环中,我们使用`std::any_cast`来根据存储的类型转换`std::any`。
std::any存储可变std::function
`std::any`可以存储任何可复制构造类型的值,包括`std::function`。然而,当`std::any`构造函数接收`std::function`时,由于`std::function`实际上是一个指向函数对象的指针,因此`std::any`构造过程会通过`std::decay_t`来处理它,使其内部实际上是函数指针[^1]。
下面是一个简单的示例演示如何使用`std::any`存储并提取`std::function`:
```cpp
#include <functional>
#include <any>
// 定义一个函数
void myFunction(int x) {
std::cout << "Function called with: " << x << std::endl;
}
int main() {
// 创建一个std::function对象
std::function<void(int)> func = std::bind(myFunction, std::placeholders::_1);
// 存储std::function到std::any
std::any myAny = func;
// 提取std::function
auto extractedFunc = std::any_cast<std::function<void(int)>>(&myAny);
// 调用存储的函数
extractedFunc(5); // 输出: Function called with: 5
return 0;
}
```
在这个例子中,`std::any_cast`允许我们安全地从`std::any`中提取出原始的`std::function`实例。