2411C++,学习C++提示2

C++26包索引

template<auto N> consteval auto nth(auto... ts) { return ts...[N]; }
static_assert(1 == nth<0>(1, 2, 3));
static_assert(2 == nth<1>(1, 2, 3));
static_assert(3 == nth<2>(1, 2, 3));

C++26包索引的第1和最后

template <size_t Index, class T0, class... Types>
constexpr decltype(auto) nth(T0&& p0, Types&&... pack) noexcept
{if constexpr (0 == Index)return std::forward<T0>(p0);elsereturn nth<Index-1>(std::forward<Types>(pack)...);
}consteval auto first(auto... ts) {return nth<0>(ts...);
}consteval auto last(auto... ts) {return nth<sizeof...(ts) - 1>(ts...);
}
static_assert(1 == first(1, 2, 3));
static_assert(3 == last(1, 2, 3));

平映

int main() {stdext::flat_map<int, int> fm{};fm.emplace(1, 2);fm.emplace(3, 4);assert(fm.size() == 2);assert(fm[1]==2 and fm[2]==3);
}

无唯一地址

template<class> struct box{};struct unique {[[no_unique_address]] box<int> _1;[[no_unique_address]] box<bool> _2;
};
static_assert(sizeof(unique)==1);struct no_unique {[[no_unique_address]] box<int> _1;[[no_unique_address]] box<int> _2;
};static_assert(sizeof(no_unique)!=1);

是独特的

template <class T> struct box {};template <class... Ts> struct unique;template <>
struct unique<> {};template <class T, class ...Args>
struct unique<T, Args ...> : public unique<Args ...> {constexpr explicit unique(T&& t, Args&&... args) : unique<Args...>(args ...) {}[[no_unique_address]] box<T> t_;
};template <class... Ts>
constexpr auto is_unique = (sizeof(unique<Ts...>) == 1);
template <typename T>
struct empty_wrap { };template <typename T, typename = decltype([]() {})>
struct unique_empty_box {[[no_unique_address]] empty_wrap<T> e;
};template <typename... Ts>
struct empty_type_pack : public unique_empty_box<Ts>... { };template <typename... Ts>
constexpr bool is_unique = sizeof(empty_type_pack<Ts...>) == 1;
template <class>
struct box {box() = delete;
};
template <class... Ts>
struct S;
template <>
struct S<> {};
template <class T, class... Ts>
struct S<T, Ts...> : S<Ts...> {[[no_unique_address]] box<T> _;
};template <class... Ts>
constexpr auto is_unique = sizeof(S<Ts...>) == 1;

线本常初化

extern constinit thread_local int var;
auto fn() { return var; }

区间串视

constexpr std::string text = "Hello, World!";
constexpr std::string_view view(text.c_str() + 7, 5);
static_assert(view == std::string_view{"World"});

显式串视缓冲

template<auto N>
struct buffer; // TODOconstexpr buffer<42> b;
static_assert(42 == std::string_view{b}.size());
static_assert(&b.data[0] == std::string_view{b}.begin());
static_assert(&b.data[42] == std::string_view{b}.end());
template <auto N>
struct buffer {constexpr buffer() {}constexpr char const* begin() const { return data; }constexpr char const* end() const { return data + N; }constexpr operator std::basic_string_view<char>() const {return std::basic_string_view<char>(begin(), end());}char data[N]{};
};

标::访问

template<class... Ts>
struct inc {std::variant<Ts...> v{};auto operator++() {std::visit([&](auto& v) { ++v; }, v);}template<class T>operator T() const {T result{};std::visit(overloaded{[&](T v) { result = v; },[](auto&&) {}}, v);return result;}
};auto visit(std::int16_t size, std::int32_t iterations) {auto it = inc<std::int8_t, std::int16_t, std::int32_t>{size};for (auto i = 0; i < iterations; ++i, ++it);return std::int16_t(it);
}

实现:

template<class F, class V, class R, std::size_t N, std::size_t Size>
constexpr auto visit_impl([[maybe_unused]] F&& f, [[maybe_unused]] V&& v) -> R {if constexpr (N < Size) {switch (v.index()) {default:return visit_impl<F, V, R, N+1, Size>(std::forward<F>(f), std::forward<V>(v));case N:return std::forward<F>(f)(std::get<N>(std::forward<V>(v)));}} else {__builtin_unreachable();}
}template<class F, class V, template<class...> class T, class... Ts>
auto result_type(T<Ts...>&&) ->std::common_type_t<decltype(std::declval<F>()(std::get<Ts>(std::declval<V>())))...>;template<class F, class V, template<class...> class T, class... Ts>
auto result_type(T<std::monostate, Ts...>&&) ->std::common_type_t<decltype(std::declval<F>()(std::get<Ts>(std::declval<V>())))...>;template<class F, class V>
constexpr decltype(auto) visit(F&& f, V&& v) {using variant_t = std::remove_const_t<std::remove_reference_t<V>>;constexpr auto size = std::variant_size_v<variant_t>;static_assert(size > 0, "Empty variant is not supported!");using result_t = decltype(result_type<F, V>(std::declval<variant_t>()));return visit_impl<F, V, result_t, 0u, size>(std::forward<F>(f), std::forward<V>(v));
}

C++26可变友

class FriendClass;class MyClass {friend class FriendClass;public:constexpr MyClass(int data) : privateData(data) {}private:int privateData;
};struct FriendClass {constexpr auto accessPrivateData(const MyClass& obj) const {return obj.privateData;}
};constexpr MyClass obj{42};
constexpr FriendClass friend_obj{};
static_assert(42 == friend_obj.accessPrivateData(obj));

扩展可变友类

template <class... Ts>
class MyClass {friend Ts...;public:constexpr explicit MyClass(int data) : privateData(data) {}private:int privateData{};
};template<auto>
struct FriendClass {constexpr auto accessPrivateData(const auto& obj) const {return obj.privateData;}
};constexpr MyClass<FriendClass<0>, FriendClass<1>, FriendClass<2>> obj{42};
constexpr FriendClass<0> friend_obj0{};
constexpr FriendClass<1> friend_obj1{};
constexpr FriendClass<2> friend_obj2{};static_assert(42 == friend_obj0.accessPrivateData(obj));
static_assert(42 == friend_obj1.accessPrivateData(obj));
static_assert(42 == friend_obj2.accessPrivateData(obj));

原位向量

int main() {std::inplace_vector<int, 2> v{};assert(v.empty());v.push_back(1);assert(1 == v.size());v.push_back(2);assert(2 == v.size());v.push_back(3); // throws
}

实现

template <class T, auto Size>
struct inplace_vector {constexpr void push_back(T value) { data_[index_++] = value; }constexpr const auto& operator[](auto index) const { return data_[index]; }constexpr auto size() const { return index_; }constexpr auto clear() { index_ = {}; }private:std::array<T, Size> data_{};std::size_t index_{};
};
template <class T, auto Size>
class inplace_vector {public:constexpr T& push_back(const T& t) {if (size_ == Size) {throw std::bad_alloc();}return arr_[size_++].emplace(t);}constexpr std::size_t size() const { return size_; }constexpr T& operator[](std::size_t idx) { return *arr_[idx]; }private:std::array<std::optional<T>, Size> arr_;std::size_t size_ = 0;
};

聚集是命名元组

#include <tuple>struct foo {int i{};bool b{};float f{};
};constexpr auto f  = foo{.i = 42, .b = true, .f = 4.2f};
static_assert(42 == std::get<0>(f) and std::get<1>(f) and 4.2f == std::get<2>(f));

聚集的取

template <typename T, std::size_t I, typename = void>
struct has_get : std::false_type {};
template <typename T, std::size_t I>
struct has_get<T, I, std::void_t<decltype(std::get<I>(std::declval<T>()))>>: std::true_type {};namespace std {
template <typename T>
concept DoesNotHaveGetConcept = requires(T t) { !has_get<T, 0>::value; };
namespace mp = boost::mp;
template <std::size_t I>
constexpr auto get(DoesNotHaveGetConcept auto s) {return std::get<I>(mp::reflection::to_tuple(s));
}
}  // namespace std

更多数学常式

#include <cmath>
constexpr auto positive = std::abs(-2);
static_assert(positive == 2);
template <char... Cs>
[[nodiscard]] constexpr auto operator""_number() {return []<auto... Is, class T = int>(std::index_sequence<Is...>) {return std::integral_constant<T, (((Cs - '0') * T(std::pow(T(10), sizeof...(Is) - Is - 1))) +...)>{};}(std::make_index_sequence<sizeof...(Cs)>{});
}#include <cmath>template <char... Cs>
[[nodiscard]] constexpr auto operator""_number();static_assert(0 == 0_number);
static_assert(42 == 42_number);
static_assert(123 == 123_number);
template <char... Cs>
[[nodiscard]] constexpr auto operator""_number() {int result = 0;((result = result * 10 + (Cs - '0')), ...);return result;
}

C++26常式从空*转换

struct foo{};
constexpr auto f1 = foo{};
constexpr auto ptr = static_cast<const void*>(&f1);
constexpr auto f2 = static_cast<const foo*>(ptr); // okay in C++26

常式擦除

struct Animal_View {const void *animal;std::string_view (*speak_func)(const void *animal);template <class Animal>Animal_View(const Animal &animal): animal(&animal), speak_func([](const void *animal) {return static_cast<const Animal *>(animal)->speak();}) {}constexpr std::string_view speak() { return speak_func(animal); }
};
struct Sheep {constexpr std::string_view speak() const noexcept { return "Baaaaaa"; }
};struct Cow {constexpr std::string_view speak() const noexcept { return "Mooo"; }
};// TODO Animal_Viewstd::string_view do_speak(Animal_View av) { return av.speak(); }int main() {using namespace boost::ut;"constexpr cast from void*"_test = [] {should("say Mooo for cow") = [] {constexpr Cow cow;auto result = do_speak(cow);expect(std::string_view{"Mooo"} == result);};should("say Baaaaaa for sheep") = [] {constexpr Sheep sheep;auto result = do_speak(sheep);expect(std::string_view{"Baaaaaa"} == result);};};
}

成员访问

// C++23
std::visit(overload{[](int i){ std::print("i={}\n", i); },[](std::string s){ std::print("s={:?}\n", s); }
}, value);// C++26
value.visit(overload{[](int i){ std::print("i={}\n", i); },[](std::string s){ std::print("s={:?}\n", s); }
});

变量成员访问

// TODO: variantint main() {constexpr variant<int, double, float> value = 42;static_assert(42 == value.visit(overload{[](int i) { return i; },[](auto)  { return 0; }}));
}
template <class... Ts>
struct overload : Ts... {using Ts::operator()...;
};
template <class... Ts>
overload(Ts...) -> overload<Ts...>;template <class... Ts>
struct variant : std::variant<Ts...> {using std::variant<Ts...>::variant;constexpr auto visit(auto f) const { return std::visit(f, *this); }
};

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

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

相关文章

chrome允许http网站打开摄像头和麦克风

第一步 chrome://flags/#unsafely-treat-insecure-origin-as-secure 第二步 填入网址&#xff0c;点击启用 第三步 重启 Chrome&#xff1a;设置完成后&#xff0c;点击页面底部的 “Relaunch” 按钮&#xff0c;重新启动 Chrome 浏览器&#xff0c;使更改生效。

IntelliJ IDEA(2024版) 的安装、配置与使用教程:常用配置、创建工程等操作(很详细,你想要的都在这里)

IDEA的安装、配置与使用&#xff1a; Ⅰ、IDEA 的安装&#xff1a;1、IDEA 的下载地址(官网)&#xff1a;2、IDEA 分为两个版本&#xff1a;旗舰版 (Ultimate) 和 社区版 (Community)其一、两个不同版本的安装文件&#xff1a;其二、两个不同版本的详细对比&#xff1a; 3、IDE…

AI前景分析展望——GPTo1 SoraAI

引言 人工智能&#xff08;AI&#xff09;领域的飞速发展已不仅仅局限于学术研究&#xff0c;它已渗透到各个行业&#xff0c;影响着从生产制造到创意产业的方方面面。在这场技术革新的浪潮中&#xff0c;一些领先的AI模型&#xff0c;像Sora和OpenAI的O1&#xff0c;凭借其强大…

基于SpringBoot实现的民宿管理系统(代码+论文)

&#x1f389;博主介绍&#xff1a;Java领域优质创作者&#xff0c;阿里云博客专家&#xff0c;计算机毕设实战导师。专注Java项目实战、毕设定制/协助 &#x1f4e2;主要服务内容&#xff1a;选题定题、开题报告、任务书、程序开发、项目定制、论文辅导 &#x1f496;精彩专栏…

ComfyUI | ComfyUI桌面版发布,支持winmac多平台体验,汉化共享等技巧!(内附安装包)

ComfyUI 桌面版正式推出&#xff0c;支持 Windows 与 macOS 等多平台&#xff0c;为 AI 绘画爱好者带来全新体验。其安装包便捷易用&#xff0c;开启了轻松上手之旅。汉化共享功能更是一大亮点&#xff0c;打破语言障碍&#xff0c;促进知识交流与传播。在操作上&#xff0c;它…

基于 Vue2.0 + Nest.js 全栈开发的后台应用

☘️ 项目简介 Vue2 Admin 是一个前端基于 Ant Design Pro 二次开发&#xff0c;后端基于 Nest.js 的全栈后台应用&#xff0c;适合学习全栈开发的同学参考学习。 &#x1f341; 前端技术栈&#xff1a; Vue2、Ant Design Vue、Vuex &#x1f341; 后端技术栈&#xff1a; Ne…

RabbitMQ 应用问题

文章目录 1. 幂等性保障什么是幂等性MQ 的幂等性如何处理消息重复的问题1. 全局唯一ID2. 业务逻辑判断 2. 顺序性保障什么是顺序性保障什么情况会打破RabbitMQ的顺序性顺序性保障方案 3. 消息积压什么是消息积压造成消息积压的原因解决消息积压的方案 结论 1. 幂等性保障 什么…

【数据库系列】MySQL基础知识:深入理解DDL、DML与DQL操作

MySQL是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛用于数据存储和管理。理解MySQL的基本操作至关重要&#xff0c;尤其是数据定义语言&#xff08;DDL&#xff09;、数据操作语言&#xff08;DML&#xff09;和数据查询语言&#xff08;DQL…

PAT1085 Perfect Sequence(25)

//判断是否是连续的数 //判断是否只能第一个数是最小值 #include <cstdio> #include <algorithm> typedef long long ll; using namespace std; int n,p; const int maxn 100010; int arr[maxn];int binary(int l, int r, ll tgt){if(arr[n-1] < tgt) return n…

Shell 编程基础知识

为什么要学 Shell&#xff1f; 学一个东西&#xff0c;我们大部分情况都是往实用性方向着想。从工作角度来讲&#xff0c;学习 Shell 是为了提高我们自己工作效率&#xff0c;提高产出&#xff0c;让我们在更少的时间完成更多的事情。 很多人会说 Shell 编程属于运维方面的知…

深入浅出UART驱动开发与调试:从基础调试到虚拟驱动实现

往期内容 本专栏往期内容&#xff1a;Uart子系统 UART串口硬件介绍深入理解TTY体系&#xff1a;设备节点与驱动程序框架详解Linux串口应用编程&#xff1a;从UART到GPS模块及字符设备驱动 解UART 子系统&#xff1a;Linux Kernel 4.9.88 中的核心结构体与设计详解IMX 平台UART驱…

Linux网络——IO模型和多路转接

通常所谓的IO&#xff0c;其本质就是等待通信和进行通信&#xff0c;即IO 等 拷贝。 那么想要做到高效的IO&#xff0c;就要在单位时间内&#xff0c;减少“等”的比重。 一.五种IO模型 阻塞 IO: 在内核将数据准备好之前, 系统调用会一直等待. 所有的套接字, 默认都是阻塞方…

VM Virutal Box的Ubuntu虚拟机与windows宿主机之间设置共享文件夹(自动挂载,永久有效)

本文参考如下链接 How to access a shared folder in VirtualBox? - Ask Ubuntu &#xff08;1&#xff09;安装增强功能&#xff08;Guest Additions&#xff09; 首先&#xff0c;在网上下载VBoxGuestAdditions光盘映像文件 下载地址&#xff1a;Index of http://…

AI的魔力:如何为开源软件注入智慧,开启无限可能

“AI的魔力&#xff1a;如何为开源软件注入智慧&#xff0c;开启无限可能” 引言&#xff1a; 在科技发展的浪潮中&#xff0c;开源软件生态一直扮演着推动创新与共享的重要角色。从Linux到Python&#xff0c;开源项目赋予了开发者全球协作的机会&#xff0c;推动了技术的飞速…

IThenticate 查重有无免费午餐?深度解析

经历过论文“折磨”的过来人&#xff0c;深知查重工具是写论文不可或缺的助手。而 iThenticate 查重系统&#xff0c;深受出版商、学术机构和研究人员喜爱。不过&#xff0c;每次看到它那昂贵的价格&#xff0c;就让很多小伙伴直呼&#xff0c;IThenticate查重系统就没有免费的…

启动SpringBoot

前言&#xff1a;大家好我是小帅&#xff0c;今天我们来学习SpringBoot 文章目录 1. 环境准备2. Maven2.1 什么是Maven2.2 创建⼀个Maven项⽬2.3 依赖管理2.3.1 依赖配置2.3.2 依赖传递2.3.4 依赖排除2.3.5 Maven Help插件&#xff08;plugin&#xff09; 2.4 Maven 仓库2.6 中…

DHCP服务(包含配置过程)

目录 一、 DHCP的定义 二、 使用DHCP的好处 三、 DHCP的分配方式 四、 DHCP的租约过程 1. 客户机请求IP 2. 服务器响应 3. 客户机选择IP 4. 服务器确定租约 5. 重新登录 6. 更新租约 五、 DHCP服务配置过程 一、 DHCP的定义 DHCP&#xff08;Dynamic Host Configur…

使用 Certbot 为 Nginx 自动配置 SSL 证书

1.安装Certbot和Nginx插件 sudo apt-get update sudo apt-get install certbot python3-certbot-nginx 2.获取和安装证书 运行Certbot自动安装SSL证书。注意替换 your_domain sudo certbot --nginx -d your_domain Certbot将自动与Lets Encrypt的服务器通信&#xff0c;验证域…

ros2键盘实现车辆: 简单的油门_刹车_挡位_前后左右移动控制

参考: ROS python 实现键盘控制 底盘移动 https://blog.csdn.net/u011326325/article/details/131609340游戏手柄控制 1.背景与需求 1.之前实现过 键盘控制 底盘移动的程序, 底盘是线速度控制, 效果还不错. 2.新的底盘 只支持油门控制, 使用线速度控制问题比较多, 和底盘适配…

DICOM医学影像应用篇——窗宽窗位概念、原理及实现详解

目录 窗宽窗位调整&#xff08;Windowing&#xff09;在DICOM医学影像中的应用 窗宽窗位的基本概念 窗宽&#xff08;Window Width, WW&#xff09; 窗位&#xff08;Window Level, WL&#xff09; 窗宽窗位调整的基本原理 映射逻辑 数学公式 窗宽窗位调整的C实现 代码…