描述

类 any 描述用于任何类型的单个值的类型安全容器。

1) 类 any 的对象存储任何满足构造函数要求的类型的一个实例或为空,而这被称为 any 类对象的状态。存储的实例被称作所含对象。若两个状态均为空,或均为非空且其所含对象等价,则两个状态等价。
2) 非成员 any_cast 函数提供对所含对象的类型安全访问。
鼓励实现避免小对象的动态分配,但这种优化仅可以应用于 std::is_nothrow_move_constructible 对其返回 true 的类型。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <any>
#include <iostream>
#include <bitset>
#include <vector>
#include <algorithm>

int main()
{
std::cout << std::boolalpha;

std::bitset<5> mask("11001");
std::bitset<5> val("01111");
std::any amask = mask;
std::any aval = val;
val and_eq mask; // and_eq is &=, and is &&
std::cout << "bitset:\t" << val << "\n";

// any
std::any var = 1;
std::cout << var.type().name() << ":\t" << std::any_cast<int>(var) << '\n';
var = 2.2;
std::cout << var.type().name() << ":\t" << std::any_cast<double>(var) << '\n';
var = 3.3f;
std::cout << var.type().name() << ":\t" << std::any_cast<float>(var) << '\n';
var = true;
std::cout << var.type().name() << ":\t" << std::any_cast<bool>(var) << '\n';
var = mask;
std::cout << var.type().name() << ":\t" << std::any_cast<std::bitset<5>>(var) << '\n';
// 转换
try
{
var = 4L;
std::cout << std::any_cast<float>(var) << '\n';
}
catch (const std::bad_any_cast& e)
{
std::cout << "error:\t" << e.what() << '\n';
}
// 判断是否有值
var = 5.5f;
if (var.has_value())
{
std::cout << var.type().name() << '\n';
}
// 清空
var.reset();
if (!var.has_value())
{
std::cout << "has value:\t" << "no value\n";
}
// 直接构造
var.emplace<std::vector<char>>({ 'C', '+', '+', '1', '7', '\0'});
std::cout << var.type().name() << ":\t" << std::any_cast<std::vector<char>>(var).data() << '\n';
// foreach
const std::vector<char>* cpv = std::any_cast<std::vector<char>>(&var);
std::cout << "for_each:\t";
std::for_each(cpv->cbegin(), cpv->cend(), [](char const& c) { std::cout << c; });
std::cout << '\n';
// 指针
var = 6;
int* i = std::any_cast<int>(&var);
std::cout << "point:\t" << *i << "\n";
return 0;
}

输出

1
2
3
4
5
6
7
8
9
10
11
12
bitset: 01001
int: 1
double: 2.2
float: 3.3
bool: true
class std::bitset<5>: 11001
error: Bad any_cast
float
has value: no value
class std::vector<char,class std::allocator<char> >: C++17
for_each: C++17
point: 6

参考

https://zh.cppreference.com/w/cpp/utility/any