news 2026/11/2 6:09:11

C++ 现代教程三

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 现代教程三
// 模板参数类型区分 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++11中包含了以下几种String literal,

  • "" : Ordinary string literal
  • L"" : Wide string literal
  • u8"" : UTF-8 string literal
  • u"" : UTF-16 string literal
  • U"" : UTF-32 string literal
  • R"" : Raw string literal

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


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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/2 6:09:06

CMake基础教程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/2 6:07:04

基于MAX14431隔离器实现PIC32 SPI链路隔离的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/2 6:01:52

回形针式思维:硬件维修与调试中的低成本临时方案实战指南

1. 回形针式思维&#xff1a;一个低成本工具背后的解决思路哪怕你对“paperclip”的全部印象&#xff0c;还停留在那个总爱从 Word 里跳出来问“您需要什么帮助”的办公助手&#xff0c;我也建议你重新认识一下这截钢丝。一个标准的回形针&#xff0c;成本不到一分钱&#xff0…

作者头像 李华
网站建设 2026/11/2 6:00:14

SQL转ER图工具:自动解析数据库结构的技术实现

1. 项目背景与核心价值最近在数据库课程设计和实际开发中&#xff0c;经常遇到需要将SQL语句转换为ER图的需求。传统做法是先在PowerDesigner等工具中绘制ER图&#xff0c;再生成SQL语句&#xff0c;但逆向过程却缺乏高效工具。这个SQL转ER图小工具就是为了解决这个痛点而开发的…

作者头像 李华
网站建设 2026/11/2 5:57:30

网络安全运维:命令行效率革命与实战技巧

1. 网络安全运维的现状与痛点每天面对海量告警日志、重复性巡检任务和突发安全事件&#xff0c;运维工程师的日常就像在玩"打地鼠"游戏。我曾见过某金融企业的安全团队&#xff0c;每天要处理3000条安全告警&#xff0c;其中90%都是误报。这种低效的工作模式不仅消耗…

作者头像 李华
网站建设 2026/11/2 5:56:59

Scrapy爬取大众点评:破解字体反爬与动态数据的实战指南

简介&#xff1a;基于Scrapy框架的大众点评爬虫源码&#xff0c;适合有一定Python基础、希望学习Scrapy架构及反爬实战的爬虫开发人员。项目通过浏览器手动登录与验证&#xff0c;规避了验证码识别难点&#xff0c;同时内置代理设置与字体反爬处理&#xff0c;可有效应对大众点…

作者头像 李华