C++ std::any 如何存储任意类型,?

摘要:一、为什么要用std::any 而不是std::variant std::variant需要列出所有类型,而std::any不需要。 std::variant只是一个类型安全的union,它把所有数据存在一个union里。 std::any
一、为什么要用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(); }