C++ 现代教程三

news2024/9/17 9:08:09

// 模板参数类型区分
template <class T>
static std::string cppdemangle() {
    std::string s{cppdemangle(typeid(std::remove_cv_t<std::remove_reference_t<T>>))};
    if (std::is_const_v<std::remove_reference_t<T>>)
        s += " const";
    if (std::is_volatile_v<std::remove_reference_t<T>>)
        s += " volatile";
    if (std::is_lvalue_reference_v<T>)
        s += " &";
    if (std::is_rvalue_reference_v<T>)
        s += " &&";
    return s;
}

// 显示转换枚举值
template <class T, std::enable_if_t<std::is_enum_v<T>, int> = 0>
constexpr std::underlying_type_t<T> to_underlying(T t) noexcept {
    return static_cast<std::underlying_type_t<T>>(t);
}

template <class T, std::enable_if_t<!std::is_enum_v<T>, int> = 0>
constexpr T to_underlying(T t) noexcept {
    return t;
}

//文件操作
static std::string file_get_content(std::string const &path) {
  std::ifstream fin(path);
  std::string content;
  std::istreambuf_iterator<char> iit(fin), eiit;
  std::back_insert_iterator<std::string> sit(content);
  std::copy(iit, eiit, sit);
  return content;
}

static void file_put_content(std::string const &path, std::string const &content) {
  std::ofstream fout(path);
  fout << content;
}

static bool file_exists(std::string const &path) {
  std::ifstream fin(path);
  return (bool)fin;
}

// win min max冲突
#ifdef _WIN32
#ifndef NOMINMAX
#define NOMINMAX
#endif
#ifndef _USE_MATH_DEFINES
#define _USE_MATH_DEFINES
#endif
/* FUN FACT: DID YOU KNOW THAT MICROSOFT BUYS GITHUB? */
#if __has_include(<windows.h>)
#include <windows.h>
#elif __has_include(<math.h>)
#include <math.h>
#endif
/* FUN FACT: DID YOU KNOW THAT MICROSOFT INVENTS VSCODE? */
#ifdef min
#undef min
#endif
#ifdef max
#undef max
#endif
#ifdef near
#undef near
#endif
#ifdef far
#undef far
#endif
#endif

// 耗时
#define TICK(x) auto bench_##x = std::chrono::steady_clock::now();
#define TOCK(x) std::printf("%s: %lfs\n", #x, std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::steady_clock::now() - bench_##x).count());

// 随机字符串生成
inline std::string randomStringGenerator(const int len)
{
std::string res;
static const char alphanum[] = "0123456789"
							   "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
							   "abcdefghijklmnopqrstuvwxyz";

for (int i = 0; i < len; ++i)
  res += alphanum[((size_t)std::rand() % (sizeof(alphanum) - 1))];
return res;
}

//	C++20之三目运算
template<typename T>
void compare(T x, T y)
{
    auto ret = x <=> y;
    std::cout << "name: " << typeid(ret).name() << std::endl;
    if (ret < 0)
        std::cout << "x < y:" << x << "," << y << std::endl;
    else if (ret == 0)
        std::cout << "x == y:" << x << "," << y << std::endl;
    else
        std::cout << "x > y:" << x << "," << y << std::endl;
}

// C++20之字符与数值转换
#include <charconv>
// std::to_chars: converts an integer or floating-point value to a character sequence
std::array<char, 10> buffer;
// 注意:std::errc没有到bool的隐式转换,所以你不能像下面这样检查: if (res.ec) {} or if (!res.ec) {}
if (auto [ptr, ec] = std::to_chars(buffer.data(), buffer.data() + buffer.size(), val_int); ec == std::errc()) {
	std::cout << "str:" << std::string_view(buffer.data(), ptr - buffer.data()) << "\n"; // str:88
	*ptr = '\0'; // 保证结尾有一个空字符
	std::cout << "buffer:" << buffer.data() << "\n"; // buffer:88
} else {
	std::cerr << "fail to call to_char:" << std::make_error_code(ec).message() << "\n";
	return -1;
}

auto str2 = "456.789";
float val2{ 0.f };
auto [ptr2, ec2] = std::from_chars(str2.data(), str2.data() + str2.size(), val2);
if (ec2 == std::errc())
	std::cout << "val2:" << val2 << "\n"; // val2:456.789
else if (ec2 == std::errc::invalid_argument)
	std::cerr << "Error: this is not a number: " << str2 << "\n";
else if (ec2 == std::errc::result_out_of_range)
	std::cerr << "Error: this number is larger than an float: " << str2 << "\n";
else
	std::cerr << "fail to call from_chars:" << std::make_error_code(ec2).message() << "\n";
	
// C++17之并行策略
#include <algorithm>
#include <iostream>
#include <vector>
#include <execution>
std::vector<int> v = { 5, 2, 3, 1, 4 };
std::vector<int> v2(5);
std::sort(std::execution::seq, v.begin(), v.end());		// 向量
std::for_each(std::execution::unseq, v.begin(), v.end(), [](int x) { std::cout << x << " "; });	// 向量化单线程
std::transform(std::execution::par, v1.begin(), v1.end(), v2.begin(), [](int x) { return x * x; });  // 多线程
std::for_each(std::execution::par_unseq, v.begin(), v.end(), [](int x) { std::cout << x << " "; });	 // 硬软件或SMID

https://www.geeksforgeeks.org/execution-policy-of-stl-algorithms-in-modern-cpp/

// C++头文件定义全局变量

class InlineVariable {
public:
	inline static int var{ 10 }; // 不带inline,则只能在类外初始化;即使在类外初始化,如果被多个cpp文件包含也会error;带inline后,即使被多个cpp文件包含也OK
	inline static std::string name{ "Messy_Test" }; // 整个程序中只有一个
	inline static thread_local int count{ 1 }; // 每个线程有一个
	std::string city{ "BeiJing" }; // 每个实例有一个
};
inline InlineVariable inline_variable; // 不带inline,则会报重复定义;带inline后,即使被多个cpp文件包含也OK

// 获取实际对象地址
std::addressof(c)

C++ 现代教程二-CSDN博客


创作不易,小小的支持一下吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1918997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

商家转账到零钱申请必过攻略

商家使用微信支付的“商家转账到零钱”功能需要满足一定的条件&#xff0c;并遵循特定的开通步骤。由于人工审核提高了申请门槛&#xff0c;多数商家在申请中需要一定的操作指南才能开通&#xff0c;以下是我们上万次成功开通“商家转账到零钱”功能的经验总结&#xff0c;希望…

夏令营入门组day1

一. 题目 二. 初步思路 因为是解决区间上的问题&#xff0c;很容易想到用前缀和来解决。前缀和是o ( n ) 的时间复杂度&#xff0c;但后续枚举两个端点要 o ( n^2 )&#xff0c;对于2e10的数据&#xff0c;超时。 for (int i 1; i < n; i )for (int j i; j <n; j ){if…

小程序问题

1.获取节点 wx.createSelectorQuery() wx.createSelectorQuery().in(this) //组件中加in(this)&#xff0c;不然获取不到 2.使用实例 wx.createSelectorQuery().in(this).select(#share).fields({node: true,size: true}).exec(async (res) > {const canvas res[0].node;…

接上一回C++:补继承漏洞+多态原理(带图详解)

引子&#xff1a;接上一回我们讲了继承的分类与六大默认函数&#xff0c;其实继承中的菱形继承是有一个大坑的&#xff0c;我们也要进入多态的学习了。 注意&#xff1a;我学会了&#xff0c;但是讲述上可能有一些不足&#xff0c;希望大家多多包涵 继承复习&#xff1a; 1&…

绿洲生态OAS:探索数字新绿洲,共创价值新纪元

绿洲生态OAS的盛大启航 在数字经济的浩瀚星海中&#xff0c;一颗名为绿洲生态OAS的璀璨明珠即将于7月13日全面正式上线。这是一场对未来的探索&#xff0c;一次对财富自由的勇敢追求。绿洲生态&#xff0c;简称OAS&#xff0c;以其独特的积分发行规划&#xff0c;吸引了无数投…

电脑工具箱神器——uTools

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 很多人脑子里都有一些一个月只用两三次的软件&#xff0c;这些软件就这样积满了灰尘&#xff0c;需要的时候又不知道去哪里找。uTools 完美地解决…

C语言补充:指针的基础理解

1.int* 和 char* 的修改字节上的区别及指针的运算 先看两段代码&#xff1a; int a 0x11223344; int* pa &a; *pa 0;int a 0x11223344; char* pa &a; *pa 0;这里我们不难发现对于指针的改变其实是取决于对应的指针类型的&#xff0c;32位环境下char就是一个字节…

干货:如何高效检索和阅读文献

前言:Hello大家好,我是小哥谈。高效检索和阅读文献是科研过程中非常重要的一环,它能够帮助我们快速找到所需的信息并进行深入的学习和理解。本文就说明一下如何高效检索和阅读文献。🌈 目录 🚀1.炼成“高搜商” 🍀🍀1.1 文献检索 🍀🍀1.2 ⽂献树思维 �…

c++初阶知识——类和对象(1)

目录 1.类和对象 1.1 类的定义 1.2 访问限定符 1.3 类域 2.实例化 2.1 实例化概念 2.2 对象大小 内存对齐规则 3.this指针 1.类和对象 1.1 类的定义 &#xff08;1&#xff09;class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xf…

数据(图像)增广

一、数据增强 1、增加一个已有数据集&#xff0c;使得有更多的多样性&#xff0c;比如加入不同的背景噪音、改变图片的颜色和形状。 2、增强数据是在线生成的 3、增强类型&#xff1a; &#xff08;1&#xff09;翻转 &#xff08;2&#xff09;切割 &#xff08;3&#xf…

AI大模型API:开启智能应用的新纪元

AI大模型API是当今技术领域的重要突破&#xff0c;它们以其卓越的性能和强大的计算能力引领着人工智能的发展。这些API不仅仅是一种技术工具&#xff0c;更是推动智能化时代的核心驱动力。通过AI大模型类API&#xff0c;我们可以利用先进的算法和深度学习模型&#xff0c;实现各…

k8s NetworkPolicy

Namespace 隔离 默认情况下&#xff0c;所有 Pod 之间是全通的。每个 Namespace 可以配置独立的网络策略&#xff0c;来 隔离 Pod 之间的流量。 v1.7 版本通过创建匹配所有 Pod 的 Network Policy 来作为默认的网络策略 默认拒绝所有 Pod 之间 Ingress 通信 apiVersion: …

heic格式转化jpg?三种方法轻松解决Heic图片转换

HEIC是苹果IOS 11系统推出的图片格式&#xff0c;它采用了最新的图片处理技术&#xff0c;在不损坏图片质量的情况下&#xff0c;减少占用系统。很多使用mac系统的小伙伴都有这样的困惑&#xff0c;如何将HEIC格式的图片转换成JPG呢&#xff1f;小编今天给大家分享3种适用的hei…

Oracle安装完之后设置开机自启动配置步骤

默认&#xff1a;dbca建库时都会自动创建/etc/oratab文件 [oraclelocalhost bin]# vi /etc/oratab 将“orcl:/home/oracle/product/11.2.0/dbhome_1:N”&#xff0c;改为 “orcl:/home/oracle/product/11.2.0/dbhome_1:Y”。 修改完成后&#xff0c;保存退出--选项代表开机是…

不仅是输出信息,console.log 也能玩出花

console.log 是 JavaScript 中一个常用的函数&#xff0c;用于向控制台输出信息。 console.log 虽然主要用于调试目的&#xff0c;但也包含了一些有趣的用法&#xff0c; console.log 不仅能输出文本&#xff0c;还能以更丰富的方式展示信息。 比如我们打开 B 站&#xff0c;然…

Win10安装MongoDB(详细版)

文章目录 1、安装MongoDB Server1.1. 下载1.2. 安装 2、手动安装MongoDB Compass(GUI可视工具)2.1. 下载2.2.安装 3、测试连接3.1.MongoDB Compass 连接3.2.使用Navicat连接 1、安装MongoDB Server 1.1. 下载 官网下载地址 https://www.mongodb.com/try/download/community …

ElasticSearch(二)【基本操作以及集成 SpringBoot】

启动 elasticsearch&#xff08;脚本&#xff09;、kibana&#xff08;bat脚本&#xff09; 和 elasticsearch-head-master&#xff08;npm run start&#xff09; 1、RESTful 风格 1.1、索引类基本操作 1.1.1、创建索引 PUT /索引名/类型名/文档id {请求体} 在 elasticsear…

Rewrk一个更现代的http框架基准测试实用程序

Rewrk一个更现代的http框架基准测试实用程序。HTTP基准测试&#xff08;HTTP benchmarking&#xff09;是一种测量和评估HTTP服务器或应用程序性能指标的活动。其目的是在特定条件下模拟大量用户请求&#xff0c;以测量服务器或应用程序的响应能力、吞吐量、延迟等指标&#xf…

员工微信号怎么管理

员工走私单或者离职了删除客户&#xff0c;删除撤回的消息也能看得见

强引用?软引用?弱引用?虚引用?一文带你彻底搞懂!!

强引用&#xff1f;软引用&#xff1f;弱引用&#xff1f;虚引用&#xff1f;一文带你彻底搞懂&#xff01;&#xff01; 前言引用级别强引用软引用弱引用虚引用 总结 前言 我们知道 JVM 的 GC 是不受程序控制的&#xff0c;只要满足条件就会自动触发 那他是根据什么触发的呢…