泛形variant+visit

打印 上一主题 下一主题

主题 924|帖子 924|积分 2772

泛形variant+visit
1.引言

在python里可以让一个变量变成不同的范例,拥有不同的值,且根据不同的范例执行不同的利用,当不同的范例拥有同样的函数时,如许我们就不用再重复写一堆代码了
但如果在c++中实现类似的功能,比较经典的处理方式是用虚函数 + 子类重写的方式,
  1. class Base{
  2.     virtual void accept(visitor) = 0;
  3. }
  4. class sub1:Base{
  5.     void accept(visitor){
  6.     visitor->visit(this)
  7. }
  8. }
  9. class sub2:Base{
  10. void accept(visitor){
  11.     visitor->visit(this)
  12. }
复制代码
如许的话代码的冗余度就高了,且每次添加新都需要新建一个类
有没有更简单一些的方式呢,接下来的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
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

道家人

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表