C++学习笔记 42 C++17 std::any 如何存储任意类型的数据

一、为什么要用std::any 而不是std::variant

  1. std::variant需要列出所有类型,而std::any不需要。
  2. std::variant只是一个类型安全的union,它把所有数据存在一个union里。
  3. std::any很聪明,对于small types (小类型) 它只是把它存储为 一个Union, 它的工作方式与std::variant完全相同;而 如果你有一个大的类型,它会带你进入大存储空间:void*,在这种情况下,会动态分配内存,而动态分配内存不利于性能。
  4. 换句话说,除了更加类型安全和有一点限制性(这是一件好事)之外,std::variant在处理较大数据时也会执行得更快,而这些数据又需要避免动态内存分配。
  5. 如果存储的数据超过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();
}
posted @ 2025-12-29 17:29  超轶绝尘  阅读(2)  评论(0)    收藏  举报