首页 > 其他分享 >tour cpp: std::variant 实现无继承层次的访问者模式

tour cpp: std::variant 实现无继承层次的访问者模式

时间:2024-10-11 20:13:26浏览次数:8  
标签:std node struct ... void variant checker tour

std::variant 是基于模板而实现的一种包括了一个标志位的高级union对象;可以完全替代如下场景:

struct st {
    int type;
    union un {
        int i;
        float f;
    };
};
#include <iostream>
#include <variant>

template <class... base>
struct overloaded : base... {
  using base::operator()...;
};
template <class... base>
overloaded(base...) -> overloaded<base...>;

// struct checker;
struct Declaration {
  // void accept(checker *ckr) {
  //     std::cout << "Declaration accept it" << std::endl;
  // }
  int declaration_type{0};
};
struct Expression {};
struct Statement {};

using Node = std::variant<Declaration *, Expression *, Statement *>;
struct checker {
  void visit(Node node);
};

void checker::visit(Node node) {
  Declaration *declaration{};
  if (std::holds_alternative<Declaration *>(node) and
      (declaration = std::get<Declaration *>(node))) {
    std::cout << "declaration_type: " << declaration->declaration_type
              << std::endl;
  }  // else if ...
}

int main() {
  checker ckr;
  Declaration declaration{.declaration_type = 2};
  Node node{&declaration};
  ckr.visit(node);
  return 0;
}

标签:std,node,struct,...,void,variant,checker,tour
From: https://www.cnblogs.com/qqiwei/p/18459174

相关文章

  • Linux中提示:/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.18' not found 的解决
    一、查看gcc版本中包含哪些库#1.终端中输入如下命令:strings/usr/lib64/libstdc++.so.6|grepGLIBC#2.显示如下:===============================================GLIBCXX_3.4GLIBCXX_3.4.1GLIBCXX_3.4.2GLIBCXX_3.4.3GLIBCXX_3.4.4GLIBCXX_3.4.5GLIBCXX_3.4.6GLIBC......
  • std::binary_function 未定义问题
    使用高版本C++编译器编译旧的SDK的时候,SDK代码中会含有一些已经废弃的函数;如std::binary_function修改方式:原始代码:namespace{structNameCompare:std::binary_function<constchar*,constchar*,bool>{booloperator()(constchar*x,constchar*y)c......
  • Playoff Tournament
    算法暴力思路显然观察到更改操作最多只影响一条链于是显然代码#include<bits/stdc++.h>constintMAXLEN=263000;intk;std::stringResult;intq;intMatch;charNew_Result;intpows[20]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,......
  • c++基本介绍——std::holds_alternative()的基本介绍
    今天的工作中开发一个新功能,涉及到判断std::variant类型是否等于某个特定的值。就此机会学习一下,std::variant类型和调用std::holds_alternative进行持有值的检查。std::holds_alternative是C++17中引入的标准库函数,用于检查std::variant是否持有特定类型的值。它返回......
  • std::future概念和使用方法
    1概念std::future是C++标准库中<future>头文件提供的一个模板类,用于异步操作的结果获取。它提供了一种访问异步操作结果的机制,通常与std::async、std::packaged_task或std::promise一起使用。异步操作可以在另一个线程中执行,std::future对象允许当前线程在需要的时候获取异......
  • std::bind--改变函数参数的局限
    std::bind是C++标准库中的一个工具,用于将函数对象与部分参数绑定在一起,生成一个新的可调用对象。这使得函数的参数可以被部分或全部提前指定,从而得到一个参数更少甚至无参数的函数对象。在某些情况下,它可以用来延迟执行函数、简化函数调用,或在需要无参函数对象的场景中使用(如线......
  • abc369E Sightseeing Tour
    有N个岛和M座双向桥,编号为i的桥连接岛U[i]和V[i],过桥耗时T[i],桥连接两不同的岛屿,两个岛之间可能会有多座桥。有Q组询问,每次询问给出K座桥,问从1号岛到N号岛的最少耗时,要求给出的K座桥分别至少经过1次。2<=N<=400;N-1<=M<=2E5;1<=U[i]<V[i]<=N;1<=T[i]<=1E9;1<=Q<=3000;1<=K[......
  • 解决undefined reference to `google::protobuf::MessageLite::SerializeToString(std
    按照如下步骤安装了proto:https://zhuanlan.zhihu.com/p/631291781但是在后续的protoBuf测试demo中出现了问题 root@e23598ae2d28:/home/lee/Code/protof_test#g++test.cccontacts.pb.cc-otest_proto-lprotobuf-std=c++11-lpthread/tmp/ccbTc1bj.o:Infunction`......
  • `std::future`--异步的优势
    std::future相比于直接使用线程在C++中有几个重要的优势,主要体现在同步结果获取、简化代码管理、以及更安全的异步任务管理等方面。以下是std::future的一些主要优势:1.自动结果获取与同步std::future提供了一种便捷的机制来获取异步任务的返回值。当我们使用线程时,通常......
  • std::packaged_task<返回类型(参数类型)>
    std::packaged_task概述std::packaged_task是C++11引入的标准库模板类,用于包装一个可调用对象(如函数、lambda表达式、函数对象等),使其能够与std::future协同工作。简单来说,它将一个任务(可调用对象)包装起来,并允许你获取该任务的执行结果,这样你可以在一个线程中执行任务,并在......