一、为什么要用std::any 而不是std::variant
- std::variant需要列出所有类型,而std::any不需要。
- std::variant只是一个类型安全的union,它把所有数据存在一个union里。
- std::any很聪明,对于small types (小类型) 它只是把它存储为 一个Union, 它的工作方式与std::variant完全相同;而 如果你有一个大的类型,它会带你进入大存储空间:void*,在这种情况下,会动态分配内存,而动态分配内存不利于性能。
- 换句话说,除了更加类型安全和有一点限制性(这是一件好事)之外,std::variant在处理较大数据时也会执行得更快,而这些数据又需要避免动态内存分配。
- 如果存储的数据超过32字节,会调用new动态分配内存。
#include<iostream>
#include<string>
#include<any>
void testAny() {
std::any data;
data = 10;
//直接获取报错
//std::cout << data << std::endl;
//获取数据的方式
int dataTemp = std::any_cast<int>(data);
std::cout << dataTemp << std::endl;
data = 12.5f;
data = "Hello World"; //const char*
data = new std::string("hello world");
//会有复制
std::string str = std::any_cast<std::string>(data);
//无复制
std::string& strPtr = std::any_cast<std::string&>(data);
//这里有问题❌️
std::cout << strPtr << std::endl;
}
int main() {
testAny();
std::cin.get();
}