泛形variant+visit
1.引言
在python里可以让一个变量变成不同的范例,拥有不同的值,且根据不同的范例执行不同的利用,当不同的范例拥有同样的函数时,如许我们就不用再重复写一堆代码了
但如果在c++中实现类似的功能,比较经典的处理方式是用虚函数 + 子类重写的方式,- class Base{
- virtual void accept(visitor) = 0;
- }
- class sub1:Base{
- void accept(visitor){
- visitor->visit(this)
- }
- }
- class sub2:Base{
- void accept(visitor){
- visitor->visit(this)
- }
复制代码 如许的话代码的冗余度就高了,且每次添加新都需要新建一个类
有没有更简单一些的方式呢,接下来的variant+visit能够很好的解决该问题
2. variant
std::variant 是 C++17 标准中引入的一种数据范例,它允许在一个变量中存储多种不同范例的值,这些值被称为“备选项”或“可更换项”。std::variant 本质上是一种范例安全的联合(Union)范例
2.1 特点
- 范例安全:std::variant 确保在编译时检查范例,因此可以避免运行时的范例错误。
- 多态值:std::variant 可以存储不同的数据范例,这使得它非常机动,可以在一种范例安全的情况下处理多态值。
- 访问备选项:使用 std::get() 或 std::get_if() 可以访问 std::variant 中存储的备选项。此外,std::visit() 函数提供了一种通用的方式来访问 std::variant 中的值,类似于多态行为。
- 异常安全:与使用裸指针和范例转换相比,std::variant 提供了更好的异常安全性,由于它保证只能存储其所允许的范例。
- 更换方案:在以前的 C++ 版本中,通常会使用联合(Union)范例来实现多态值的存储,但这种方法没有提供范例安全性,并且通常需要显式的范例检查和转换。std::variant 提供了一个更安全、更方便的更换方案。
2.2 简单示例
[code]#include #include #include int main() { std::variant v; v = 10; std::cout |