1 // Cpp.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
2 //
3
4 #include <iostream>
5 #include <variant>
6 #include <any>
7 #include <string>
8 #include <optional>
9
10 using namespace std;
11 struct Visitor
12 {
13 void operator()(int m) {
14 cout << m << endl;
15 }
16 void operator()(string m) {
17 cout << m.data() << endl;
18 }
19 void operator()(float m) {
20 cout << m << endl;
21 }
22 };
23 std::optional<int> asInt(const std::string& s)
24 {
25 try
26 {
27 return std::stoi(s);
28 }
29 catch (...)
30 {
31 return std::nullopt;
32 }
33 }
34 int mains()
35 {
36 //variant 的好处是可以作为函数返回值
37 using va = std::variant<std::string, int, float>;
38 va v = 23;
39 cout << std::get<int>(v);
40 va v2 = "this is hello";
41 cout << std::get<string>(v2).data();
42 //std::visit 访问variant
43 any data = "this is any data 12";
44 v = 23;
45 std::visit(Visitor(), v); //23
46 v = "this is visitor";
47 std::visit(Visitor(), v); //"this is visitor"
48 v = 3.14157f;
49 std::visit(Visitor(), v); //3.14159
50 //any
51 std::any a = 2;
52 cout << endl << a.type().name() << endl;
53 a = "string";
54 cout << endl << a.type().name() << endl;
55 a = nullptr;
56 cout << endl << a.type().name() << endl;
57 if (nullptr == std::any_cast<std::nullptr_t>(a))
58 {
59 cout << "nullptr" << endl;
60 }
61
62 string tstr = "this is my str";
63 //string_view 不会创建tstr的副本
64 std::string_view view = tstr;
65 cout << view.data() << endl; //this is my str
66 tstr = "i changed it";
67 cout << view.data() << endl; //i changed it
68 //条件内声明变量
69 int m = 12;
70 if (int j = 23; j < 24)
71 {
72 cout << j;
73 }
74 //
75 // convert string to int if possible:
76 /*std::optional<int> asInt(const std::string& s)
77 {
78 try
79 {
80 return std::stoi(s);
81 }
82 catch (...)
83 {
84 return std::nullopt;
85 }
86 }*/
87 for (auto s : { "42", " 077", "hello", "0x33" })
88 {
89 std::optional<int> oi = asInt(s);
90 if (oi.emplace()) { //.has_value()
91 std::cout << "convert '" << s << "' to int: " << *oi << "\n";
92 }
93 else {
94 std::cout << "can't convert '" << s << "' to int\n";
95 }
96 }
97 std::optional<int> opt1 = std::make_optional(23);
98 std::optional<int> opt2 = 22;
99 //访问值*opt2 或者opt2.value()
100 cout << *opt2 << endl; //opt2
101 cout << opt2.value()<<endl; //opt2
102 opt2.emplace(34); //重新赋值
103 cout << *opt2 << endl; //34
104 cout << opt2.value()<<endl; //34
105 opt2.reset(); //清空
106 //opt2.value(); //为nullopt时,调用value报异常
107 cout << opt2.value()<<endl;
108
109 }

c++ 17 demo的更多相关文章

  1. ASP.NET MVC DefaultModelBinder

    转载自 Leo‘s Blog 看到很多ASP.NET MVC项目还在从request.querystring或者formContext里面获取数据,这实在是非常落后的做法.也有的项目建了大量的自定义的 ...

  2. AngularJS 实现页面滚动到底自动加载数据的功能

    要实现这个功能,可以通过https://github.com/sroze/ngInfiniteScroll这个第三方控件来实现.步骤如下: 1. 下载ng-infinite-scroll.js程序ht ...

  3. jquery 页面加载效果

    30个jquery 页面加载效果 30个jquery 页面加载效果   30 CSS Page Preload Animations   加载效果列表 Square Animations Demo 1 ...

  4. php中的form表单

    表单处理 表单的概念在生活中很常见,就像是问卷调查表一样,别人先把问卷发给你,你照着问卷的要求填写,完事过后再将填完的问卷发给别人,从而达到一个将别人需要的信息传递给别人的一种方式. 传统的网页大多数 ...

  5. java学习之- 线程继承Thread类

    标签(空格分隔): 线程 在java.lang包中有个Thread子类,大家可以自行查阅文档,及范例: 如何在自定义的代码中,自定义一个线程呢? 1.通过对api的查找,java已经提供了对线程这类事 ...

  6. [转] js async await 终极异步解决方案

    阅读目录 回顾 Promise async await 字面理解 async.await 如何执行 await 操作符 总结 既然有了promise 为什么还要有async await ? 当然是pr ...

  7. FreeRTOS 基础简介

    为什么选择FreeRTOS UCOS资料多,尤其是中文资料.FreeRTOS资料少,而且大多数是英文的.原因如下: 1.FreeRTOS免费!UCOS收费.这是主要原因 2.很多半导体厂商,采用Fre ...

  8. 基于OpenDDS应用程序开发(3)订阅端实现

    连续的三篇博文演示如何基于OpenDDS开发应用程序,将数据从发布端节点发送到订阅端节点,该示例程序由一个发布者发布数据,一个订阅者订阅数据,使用默认的QoS策略和TCP/IP传输方式. 本文是第三篇 ...

  9. Yolov4性能分析(上)

    Yolov4性能分析(上) 一.目录 实验测试 1) 测试介绍 2) Test 3) Train 二.   分析 1.实验测试 1. 1  实验测试方法 Yolov4训练train实验方法(Darkn ...

  10. idea字节码插件JClassLib——阅读JVM字节码

    idea字节码插件JClassLib--阅读JVM字节码 生成字节码文件并查看 查看字节码文件的方式:javac 文件名.java 即可生成.class文件,但是这种方式不方便 java:是运行字节码 ...

随机推荐

  1. Python的进程和线程——一些基础概念

    1. 线程和进程 1.1 线程和进程 进程可以包含多个并行运行的线程: 通常,操作系统创建和管理线程比进程更省CPU资源: 线程用于一些小任务,进程用于繁重的任务: 同一个进程下的线程共享地址空间和其 ...

  2. Windows中实现将bat或exe文件作为服务_且实现命令行安装、配置、启动、删除服务

    一.背景描述 在Windows环境下进行日常的项目开发过程中,有时候需要将bat文件或exe文件程序注册为Windows的服务实现开机自己运行(没有用户登陆,服务在开机后也可以照常运行).且对于那些没 ...

  3. kubernetes使用metrics-server进行资源监控

    kubernetes资源监控 1. 查看集群资源状况 ·k8s集群的master节点一般不会跑业务容器· kubectl get cs #查看master资源状态 kubectl get node # ...

  4. GCD Timer事件的精度

    一.测试环境 iPhoneX 真机+Debug模式,Timer代码工作在主线程,主线程空闲不阻塞 在子线程统计每3秒tick计数,逐步减小inteval,看能达到多大精度. 忽略原子计数值操作的影响 ...

  5. java8 Optional使用 stream filter多级过滤

    java8 Optional使用 stream filter多级过滤 package com.example.core.mydemo.java8; public class MyModel { pri ...

  6. Apollo quick start SampleApp demo Java

    <!--配置中心--> <dependency> <groupId>com.ctrip.framework.apollo</groupId> <a ...

  7. CentOS7安装最新版ruby

    背景 直接通过yum安装的ruby版本太低,不能满足redis.fpm等软件的需求. 系统环境 CentOS7 安装步骤 下载ruby http://www.ruby-lang.org/en/down ...

  8. EthernetIP IO从站设备数据 转opc ua项目案例

    1 案例说明 设置网关采集EthernetIP IO设备数据 把采集的数据转成opc ua协议转发给其他系统. 2 VFBOX网关工作原理 VFBOX网关是协议转换网关,是把一种协议转换成另外一种协议 ...

  9. 高通LCD开发常见问题&分析

    reference : https://blog.csdn.net/sinat_34606064/article/details/77921323 https://www.cnblogs.com/bi ...

  10. 嵌入式Linux如何设置获取uboot参数

    --- title: 嵌入式Linux如何设置获取uboot参数 EntryName: embeded-linux-debug-get-and-set-u-boot-envarg date: 2020 ...