std::any用法示例

说明:std::any只在支持C++17或以上标准的编译器下才有,C++17标准之前的编译器不支持。

定义在any头文件中:#include <any>
是一个可用于任何类型单个值的类型安全的容器.

使用方法

#include <any>
#include <iostream>

int main() {
	// 存储任意类型的单个值
	// 成员函数type():返回容器中的值的类型
	// 非成员函数std::any_cast<T>():强制类型转换
	std::any a = 1;
	std::cout << a.type().name() << ": " << std::any_cast<int>(a) << '\n';// i: 1
	a = 3.14;
	std::cout << a.type().name() << ": " << std::any_cast<double>(a) << '\n';// d: 3.14

	// bad_any_cast
	try {
		a = 1;
		std::cout << std::any_cast<float>(a) << '\n'; // 此处不加异常捕获会崩溃
	}
	catch (const std::bad_any_cast& a) {
		std::cout << a.what() << '\n';// bad any_cast
	}

	// has_value: 是否有值
	any h = 1;
	if (h.has_value()) {
		std::cout << h.type().name() << std::endl;// i
	}

	// reset:清空容器
	h.reset();
	if (h.has_value()) {
		std::cout << "no value\n";// no value
	}

	std::cout << h.type().name() << '\n';
	try {
		std::cout << std::any_cast<int>(h) << '\n'; // 此处不加异常捕获会崩溃
	}
	catch (std::bad_any_cast&a)
	{
		std::cout << "fefe\n";
	}

	// pointer to contained data
	h = 1;
	int* i = std::any_cast<int>(&h);// 这里有点奇怪
	std::cout << *i << '\n';// 1

	system("pause()");
	return 0;
}

说明:

  • 对不同类型值的进行std::any_cast强转会导致崩溃,如16行代码所示
  • 对值执行reset后,其type().name()变为void
  • 对值执行reset后,再执行对应类型的std::any_cast会崩溃,如36行代码所示
  • 对指针进行std::any_cast操作,对应的类型转换是其对应的类型而不是类型的指针,如45行代码中是
    int* i = std::any_cast<int>(&h);

     而不是:

   

int* i = std::any_cast<int*>(&h);/

上例输出如下:

总结:

std::any a = 1;: 声明一个any类型的容器,容器中的值为int类型的1
a.type(): 得到容器中的值的类型
std::any_cast<int>(a);: 强制类型转换, 转换失败可以捕获到std::bad_any_cast类型的异常
has_value(): 判断容器中是否有值
reset(): 删除容器中的值
std::any_cast<int>(&a): 强制转换得到容器中的值的地址

本文参考了:https://blog.csdn.net/u012086173/article/details/86421202

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值