自C11起支持用户自定义字面量,用户定义字面量有如下: 字面量运算符 用户定义字面量所调用的函数被称为字面量运算符,形式为:operator""标识符; 字面量运算符仅允许下列形参列表: 详细说明可以参见【1】; 用户可以自定义字面量进行单位转换或类型转换,例如: structmytype { unsignedlonglongm; }; constexprmytypeoperator""_km(unsignedlonglongn) { return{n}; } mytypey=123_km; 字面量运算符模板 如果字面量运算符是模板,那么它必须有空形参列表,并且只能有一个模板形参,...

  ZXL8ALkrtBPG   2023年12月06日   24   0   0 字面量c++

限定作用域枚举类型与不限定作用域枚举类型的区别在[1]的条款10中有较为详细的描述,其中一个要点为: 限定作用域枚举型仅在枚举类型内可见,他们只能通过强制类型转换以转换到其他的类型,换言之不支持隐式的类型转换,举个例子: enumclassColor:int32_t{//限定作用域枚举 black, white, red }; int32_tcolor=Color::black;//compileerror:cannotconvert‘Color’to‘int32_t’{aka‘int’}ininitialization enumColor:int32_t{//非限定作用域枚举 bla...

  ZXL8ALkrtBPG   2023年11月19日   31   0   0 cpp

copy-and-swap为C中的惯用法,用于在拷贝赋值函数中保证对象完整性,提供异常保证,以代码为例【1】: classCharStore{ public: CharStore(std::size_tsize=0): sz(size), store(std::make_unique<char[]>(sz)){} //Copy-constructor CharStore(constCharStore&other): sz(other.sz), store(std::make_unique<char[]>(sz)){ std::copy(other.store....

  ZXL8ALkrtBPG   2023年11月19日   18   0   0 cpp

在阅读Tick库中的一段代码时,发现一个问题: template<typenameT> classTestClass{ public: template<typename=std::enable_if_t<std::is_integral<T>::value,int>> std::false_typeFunc() { return{}; } template<typename=std::enable_if_t<!std::is_integral<T>::value,int>> std::true_typeF...

  ZXL8ALkrtBPG   2023年11月19日   22   0   0 c++

C标准当前并没有提供反射能力,在yaLanTingLibs中提供了一种反射机制,结合源码对库中使用的编程手法进行简单分析,包括编译期获取结构体成员字段的个数,各个字段的类型;读取结构体字段; 编译期获取结构体字段个数 structTest{ int32_tv1; int32_tv2; int32_tv3; int32_tv4; }; Testt{1,2,3,4};//完成聚合初始化 Testt{1,2,3,4,5};//编译出错,error:toomanyinitializersfor‘Test’ 当初始化个数超过结构体字段个数时则会报错,正是利用这个约束在编译期得到字段个数 te...

  ZXL8ALkrtBPG   2023年11月12日   32   0   0 c++

协程是能暂停执行以再之后恢复的函数,C协程是无栈的:它们通过返回到调用方暂停执行,并且恢复执行所需的数据与栈分离存储,这样就可以编写异步执行的顺序代码【1】; 但使用起来还是需要一些学习成本,本文主要对C协程的使用进行总结。 C20中协程 C20中提供了协程的支持,一个函数中包含co_await、co_yield、co_return关键字则都是协程,从一个简单的协程例子【2】入手分析协程的工作流程: structReturnObject{ structpromise_type{ ReturnObjectget_return_object(){return{};} std::suspend_n...

  ZXL8ALkrtBPG   2023年11月02日   46   0   0 cpp

SFINE(substitutionfailureisnotanerror) 在模板编程中,SFINE是比较常见的一种特性,举个例子【1】: template<typenameT,unsignedintN>std::size_tGetArrayLen(T(&)[N]){returnN;}template<typenameT,unsignedintN>T::SizeTypeGetArrayLen(constT&t){returnt.Size();}intmain(){intarray[10];GetArrayLen(array);return0;...

  ZXL8ALkrtBPG   2023年11月02日   53   0   0 c++

问题说明 什么是TheBarton-NackmanTrick? 1994年,Barton和Nackman提出的一种模板编程技巧,由于当时模板函数重载和命名空间等机制不完善的背景下提出的一种技巧,现在通常配合CRTP进行设计; 例如自定义类型ValWrapper需要实现equality操作,常见的方法如下,定义为类内成员函数: template<typenameT> structValWrapper{ ValWrapper(Tv):m_val(v){} booloperator(constValWrapper&v)const { return(m_valv.m_val); ...

  ZXL8ALkrtBPG   2023年11月02日   67   0   0 c++

STL中适配器包括容器适配器、迭代器适配器和仿函数适配器,本文结合源码介绍STL中常见的迭代器适配器(iteratoradaptor),以及如何自定义一个iteratoradaptor;涉及到的知识点包括adaptor设计模式,Facade设计模式,CRTP等设计范式; adaptor&Facade设计模式介绍 既然是iteratoradaptor,那首先简单介绍下adaptor设计模式,Facade设计由于在“自定义迭代器适配器实现”一节中会进行应用,所以在此一并进行介绍,已经熟知的同学可跳过; adaptor设计模式 适配器模式是将一个类进行封装转换成业务兼容的接口,例如生活中的电...

  ZXL8ALkrtBPG   2023年11月02日   48   0   0 设计模式迭代器cpp

intrusivelist意为侵入式链表,而这里的侵入式是对list中元素代码的适度改造,为intrusivecontainer的其中一种容器;与之相对应的是非侵入式链表,stl中的容器都属于非侵入式容器,非侵入式容器不需要元素进行任何修改因此更加方便,但同时在性能上会有存在一些tradeoff。 std::list内存申请 stl中list为顺序容器,迭代器类型为双向迭代器,内部实现为双向环形链表,其负责元素的内存分配,通过简单测试: classPerson{ public: Person() { std::cout<<"PersonCons"<<std::endl...

  ZXL8ALkrtBPG   2023年11月02日   68   0   0 Listcpp

默认实参 默认实参在C编程实践中非常常见,但其中也有一些有趣的知识点与扩展,本文对默认实参做简单总结; 函数默认实参 默认实参用来取代函数调用中缺失的尾部实参: voidProcess(intx=3,inty=4){} 拥有默认实参的形参之后的形参必须在同一作用域内有声明提供了默认参数,否则编译失败: voidProcess(intx=3,inty){}//编译失败 voidProcess(intx,inty=4); voidProcess(intx=3,inty){}//编译成功 voidProcess(intx,inty=4); namespaceTest{ voidPr...

  ZXL8ALkrtBPG   2023年11月02日   38   0   0 cpp

隔离变化     软件设计的主要目标就是适应变化,在需求中去识别变化,从而进行抽象隔离变化,并且符合SOLID准则,良好的设计可以让程序员少加些班,好保住“猿类”们那珍惜的毛发。    有过面向对象开发经验的同学自然能想到继承,通过抽象基类实现多态,来隔离不同派生类型进行差异处理: 用户依赖于抽象基类,与具体的实现类型解耦: structUser{ User(std::unique_ptr<Shape>shape):m_shape(std::move(shape)){} voidProcess() { m_s...

  ZXL8ALkrtBPG   2023年11月02日   51   0   0 c++

std::tuple为C11引入的特性,它可以容纳任意类型的元素,同时具有编译期计算的特性,在元编程中也有广泛的应用,在之前博文【3】中也利用tuple实现了默认模板参数的扩展,本文结合其他实践来介绍tuple的应用。 基础功能 tuple创建与元素获取 usingboost::typeindex::type_id_with_cvr; intmain() { intn=1; autot=std::make_tuple(10,"Test",3.14,n); std::cout<<"type:"<<type_id_with_cvr<decltype(t)>(...

  ZXL8ALkrtBPG   2023年11月02日   48   0   0 cpp

空基类优化基础 为保证同一类型的不同对象地址始终不同,要求任何对象或成员子对象的大小至少为1个字节,即使这个类为一个空类。 structA{};//只包含类型成员、非虚函数或静态成员变量 intmain() { DBG_LOG("%d",sizeof(A));//输出为1 } structA{}; structDerived { inti; Aa; }; intmain() { DBG_LOG("%d",sizeof(Derived));//输出为8 } 当空类作为类成员时,由于空类占用一个字节,并且内存对齐之后则Derived则需要占用8个字节,存在内存浪费; 运用空基类优化之...

  ZXL8ALkrtBPG   2023年11月02日   68   0   0 c++

C中通过宏编程配合模板元编程,可以在编译期实现很多有趣的设计;同时C的宏编程是图灵完备的,本文介绍在平时编码中经常使用的一些宏编程特性。 宏展开规则 C标准n4296中的第16章对宏编程预处理进行详细说明【1】; defineEXPAND_PARAM(arg1,arg2)arg1,arg2 EXPAND_PARAM(int,float)//类似函数调用 宏调用类似于函数调用,参数于函数参数相同,以逗号进行分隔; 如果宏参数为另一个宏,和函数调用时一样,宏代码在预处理扫描过程中会将参数中的宏先展开: template<typename...Ts> voidFun(Ts&amp...

  ZXL8ALkrtBPG   2023年11月02日   66   0   0 cpp

DiscriminatedUnions意为可识别的union,一个union变量知道自己是什么类型,或者说怎么去解释这片存储空间,std::variant即为C17引入的类型安全的union类型,本文主解析std::variant的两种实现方式; 内存 如果借助tuple来实现: template<typename...Types> classVariant{ public: std::tuple<Types...>storage; unsignedchardiscriminator;//用于标识当前存储类型的索引 }; 通过std::get<discrimi...

  ZXL8ALkrtBPG   2023年11月02日   46   0   0 cpp

C表达式为立即求值,例如x+yz表达式,x+y会产生一个临时变量进行存储;对应向量表达式同时具有可读性(重载operator),在C中我们容易得到以下实现: template<typenameT> classArray{ public: T&operator[](size_tindex) { returnm_arr[index]; } Toperator[](size_tindex)const { returnm_arr[index]; } size_tSize()const { returnm_arr.size(); } Array(size_tsize,cons...

  ZXL8ALkrtBPG   2023年11月02日   76   0   0 cpp

模板实例化过程:在编译期间通过替换模板参数获取到一个类型或者函数的过程,其中涉及到模板实参推导等过程,本文主要介绍模板实例化的相关基础; 延迟实例化 引用【1】中的代码示例进行说明: template<typenameT> classSafe{ }; template<intN> classDanger{ intarr[N]; }; template<typenameT,intN> classTricky{ public: voidnoBodyHere(Safe<T>=3)//OKuntilusageofdefaultvalueresult...

  ZXL8ALkrtBPG   2023年11月02日   26   0   0 cpp

模板元函数基本概念 支持在编译期调用并完成计算的函数即称为模板元函数,由于是在编译期完成,进而改善运行时的性能。元函数实际上即为C中的一个模板类。 元函数的通常形式为: template<typenameT,typenameTs>//元函数列表 structMetaFunction{//元函数名 usingType=some-type-define;//返回的类型元数据 staticconstexprintvalue=some-comile-time-cal//返回的数值元数据 }; 和函数调用一样,元函数调用也有形参、实参的概念,即templateparameter和temp...

  ZXL8ALkrtBPG   2023年11月02日   31   0   0 cpp

range概念介绍 ranges为C20引入的新特性,是对迭代器和算法库的扩展,Cstl中的容器都可以视作一个range。 那什么是range?range是一个concept,其中concept概念可参考博文【3】中的Constraitsandconcepts介绍。 namespacestd::ranges{ template<classT> conceptrange=requires(T&t){ ranges::begin(t); ranges::end(t); }; } 标准库头文件为:<ranges>,命名空间: namespacestd{names...

  ZXL8ALkrtBPG   2023年11月02日   33   0   0 cpp
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~