描述 类 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; std::cout << "bitset:\t" << val << "\n" ; 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' ; 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