std::make_any

该函数模板是创建 std::any 对象

emplate< class T, class... Args >
std::any make_any( Args&&... args );

(1)(C++17 起)

template< class T, class U, class... Args >
std::any make_any( std::initializer_list<U> il, Args&&... args );

(2)(C++17 起)

构造含 T 类型对象的 any 对象,传递提供的参数给 T 的构造函数。

1) 等价于 return std::any(std::in_place_type<T>, std::forward<Args>(args)...);

2) 等价于 return std::any(std::in_place_type<T>, il, std::forward<Args>(args)...);


#include <any>
#include <complex>
#include <functional>
#include <iostream>
#include <string>

int main()
{
	auto a0 = std::make_any<std::string>("Hello, std::any!\n");
	auto a1 = std::make_any<std::complex<double>>(0.1, 2.3);

	std::cout << std::any_cast<std::string&>(a0);
	std::cout << std::any_cast<std::complex<double>&>(a1) << '\n';

	using lambda = std::function<void(void)>;

	// 把 lambda 放入 std::any。尝试 #1 (失败)。
	std::any a2 = [] { std::cout << "Lambda #1.\n"; };
	std::cout << "a2.type() = \"" << a2.type().name() << "\"\n";

	// any_cast 转型到 <void(void)> 但实际类型不是
	// std::function ……,而是 ~ main::{lambda()#1} ,且它对
	// 每个 lambda 唯一。所以这会抛出……
	try {
		std::any_cast<lambda>(a2)();
	}
	catch (std::bad_any_cast const& ex) {
		std::cout << ex.what() << '\n';
	}

	// 将 lambda 放入 std::any 中。尝试 #2 (成功)
	auto a3 = std::make_any<lambda>([] { std::cout << "Lambda #2.\n"; });
	std::cout << "a3.type() = \"" << a3.type().name() << "\"\n";
	std::any_cast<lambda>(a3)();

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

运行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值