C++17 新特性——std::variant

1、介绍:

        std::variant是 C++17 引入的一个类型安全的联合体,它允许一个变量在不同的时间存储不同类型的值。其提供了类型安全性,确保每次只有一个类型的值被存储,并且可以在运行时检查和访问存储的类型

std::variant<T, T, T...>  v;

2、访问:

std::get<int> (v);        //获取存储的整数值

直接用get获取不能保证v里的数据类型为int,若为其他类型则会报异常!

std::get_if<int> (&v)      //如果类型不匹配,返回一个空指针(nullptr),避免抛出异常
if ( auto p = get_if<int> (&v) ){

        cout << *p << endl;        

}

4、判断存储类型:

std::holds_alternative<T> (v)    //检查是否为T类型

5、运行代码:

#include <variant>
#include <iostream>

int main()
{

	std::variant<int, double, std::string> v;

	v = 42; // 存储一个整数
	std::cout << std::get<int>(v) << std::endl; // 获取整数

	v = 3.14; // 存储一个浮点数
	std::cout << std::get<double>(v) << std::endl; // 获取浮点数

	v = "Hello, variant!"; // 存储一个字符串
	std::cout << std::get<std::string>(v) << std::endl; // 获取字符串

	if (auto p = std::get_if<int>(&v)) {	//当前类型为 string, 故 p 为 nullptr
		std::cout << *p << std::endl;   
	}

	if (auto p = std::get_if<std::string>(&v)) {
		std::cout << *p << std::endl;		// 打印 "Hello, variant!"
	}

	if (std::holds_alternative<int>(v)) {
		std::cout << "v 类型为 int!" << std::endl;
	}
	if (std::holds_alternative<std::string>(v)) {
		std::cout << "v 类型为 string!" << std::endl;
	}

	return 0;
}

6、运行结果:

7、配合 std::visit 使用

std::visit 是一个模板函数,它允许为 variant 中的每种类型提供一个处理函数,它会自动调用对应的处理函数,其会根据 v 当前存储的类型选择合适的lambda函数进行调用。

std::visit ( 函数对象 ,  v);

lambda函数:

#include <variant>
#include <iostream>

int main()
{

	std::variant<int, double, std::string> v;
	v = 42;
	std::visit([](auto&& arg) { std::cout << arg << std::endl; }, v);

	v = 3.14;
	std::visit([](auto&& arg) { std::cout << arg << std::endl; }, v);

	v = "Hello, variant!";
	std::visit([](auto&& arg) { std::cout << arg << std::endl; }, v);

	return 0;
}
42
3.14
Hello, variant!

重载函数:

#include <variant>
#include <iostream>

struct Visitor {
	void operator()(int i) const {
		std::cout << "Integer: " << i << std::endl;
	}

	void operator()(double d) const {
		std::cout << "Double: " << d << std::endl;
	}

	void operator()(const std::string& s) const {
		std::cout << "String: " << s << std::endl;
	}
};

int main()
{
	std::variant<int, double, std::string> v;

	v = 42;
	std::visit(Visitor(), v);

	v = 3.14;
	std::visit(Visitor(), v);

	v = "Hello, variant!";
	std::visit(Visitor(), v);

	return 0;
}
Integer: 42
Double: 3.14
String: Hello, variant!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值