CppMore
其他
借助 ChatGPT 快速实现一个轻量级的控制台进度条库
生成代码,验证是否符合需求,若不符合,纠正错误,让它再次生成,不断重复这个过程,直到基本满足期待的效果。如果一开始的效果就完全牛头不对马嘴,那也可以让它基于
其他
An In-depth Look at C++ Keyword: static
和堆栈数据就属于这一时期。内存布局和存储时期搞清楚了,下面需要理解链接的基本概念。3链接不同的数据作用范围也不尽相同,如何调整数据的作用范围?就是通过那些变量修饰符,它们能改变数据的链接方式。每个
其他
Overview of C++23 Features
新年伊始,要说什么选题最合适,那无疑是C++23了。去年只写过Ranges和几个小特性的提案,对于其他特性,就全放在此篇一览究竟。23是个小版本,主要在于「完善」二字,而非「新增」。因此,值得单独拿出来写篇文章的特性其实并不多,大多特性都是些琐碎小点,三言两语便可讲清。本篇包含绝大多数C++23特性,难度三星就表示只会介绍基本用法,但有些特性的原理也会深入讲讲。1Deducing
2023年1月10日
其他
洞悉C++函数重载决议
本篇主题比较复杂,分成五六篇来写也毫不为过,但为了保证内容的完整性及连贯性,最终还是写成了一篇。因此篇幅较长,可以多读几遍,定能解除不少疑惑,对语言有更加深刻的理解。大家可以尝试问自己一个问题:调用一个重载函数,编译器是如何找到最佳匹配函数的?若是你不能清楚地表述这个流程,就说明对函数重载决议缺乏认识。函数重载决议也的确是许多C++开发者都听过,但却从来没有真正理解过的一个概念,基本上也没有书籍深入讲解过这一重要概念,然而对语言的深刻理解往往就是建立在对这些基本概念的理解之上。那么理解这个有什么用呢?对于库作者,理解重载决议必不可少。因为重载涉及函数,函数又是变化的最小单元之一,可以说重载决议贯穿了「定制点」的发展历程。只有理解重载决议,才能理解各种定制点的表现方式,比如ADL二段式、CPOs、Deducing
2022年9月4日
其他
"Hello World" in C++23
output进入C++23不过是水到渠成。这种先引入再扩展的标准发展方式在C++中已不稀奇,这两个新特性自然也就成为C++23中主要的特性之二。C++2a之后,Ranges,
2022年7月29日
其他
使用Concepts表示变化「定制点」
在设计程序时,我们经常需要分离不变的和变化的逻辑。将不变的逻辑放到一块,再以某种形式为变化的部分提供「定制点」,从而使程序具有更好的可扩展性,同时增加相似逻辑的可复用性。因此,本质上来说,设计是为了应对变化。通过抽离系统的变化点,再以合适的结构来表示变化,从而控制变化的影响范围。C++提供许多技术来表示定制点,大家最熟悉的就是OOP的继承和多态,而Concepts也是其中之一。那么Concepts为何可以表示定制点?它又产生了怎样的结果?这种方式有哪些好处?又有哪些缺点?与继承的方式有哪些区别?流程有何变化?实际例子有哪些?这些问题,就是本篇将要讨论的内容。首先,让我们来探讨一个问题:变化的最小单元是什么?一个程序是一个系统,一个系统必须具备三个最基本的元素:输入、处理和输出。这三个元素都存在变化,不同的输入对应不同的处理,导出不同的结果。在编程语言中,输入和输出对应「数据」,处理对应「方法」。不同类型的数据需要不同的方法来进行处理,无数个数据和方法构成了整个程序。因此,变化就存在于数据与方法当中。OOP通过组块,将数据与方法组合起来,称为一个类,一个类就是一些具有联系的数据与方法的集合。但是,只有一个类无法应对变化,任何变化都会引起对该类的修改,或是重新编写相同的方法。因此,对需要共用某些相同数据或方法的一些类,进行向上一层的抽象,把这些相似的数据或方法放到更高层级,将其他变化的逻辑放到更低层级,使得低层级类可以使用高层级类的共有逻辑,从而提供扩展和复用的能力。通过这种结构化方式,将具备相似关系的类置于一个「层级体系」,高层级的类具有更高的抽象,低层级的类则更加具体。于是,高层级的类可以用来表示接口,低层级的类可以用来定制具体实现,以此来表示变化。「继承」便是用来表示层级关系,而「多态」则是用来重新定义方法。Concepts是命名的约束,约束其实是一种条件关系,只有满足某些条件才能触发接下来的操作。OOP中,处于同一层级体系的类本身就是一种约束,对于其他类,由于不在该层级当中,因此不符合约束,也就无法使用那些共有的操作了。若要使用这些共有方法,则需要通过继承添加定制点。既然Concepts表示约束,那么就也可以作为一种表示定制点的方式。那么具体来看,继承和多态是如何表示定制点的呢?让我们以一个简单的例子来说明://
2022年7月22日
其他
C++23 | Ranges的修复与完善
C++23中,Ranges更新占比挺大,足有二十多个相关提案。其中主要包含两部分内容,一是修复已知问题,二是完善遗落组件。简单来说,就是对于C++20的收尾工作。本篇就集中于介绍Ranges的一些新变化。1.
2022年7月17日
其他
泛型Lambda,如此强大!
最近发现泛型编程有了另一利器——泛型Lambda,比想象当中要强大许多,威力不小,和大家分享一下。本篇内容需要对泛型编程有所了解,若是读过之前更新的相关文章,食用更佳。1泛型编程开始之前,先来简单回顾一下泛型编程的内容。泛型编程的目的是将「数据和方法」进行分离,将数据高度抽象,于是可以表示同类问题的「最小通解」。C++中,通过模板来实现泛型编程,模板又分为变量模板、函数模板和类模板。这些模板始终围绕着「数据和方法」。变量模板属于对数据类型的抽象,函数模板属于对方法的抽象,而类模板,则二者兼有,因为类本身的目的就是将数据和方法进行结合。因此为什么说函数模板处理的是数值,而类模板处理的是类型呢?就是由于函数只具有方法,而在C++中方法是不支持偏特化的,所以它无法处理类型。到了C++14,Lambda也迎来了泛化能力,称为Generic
2022年1月16日
其他
那些值得使用的标准Attributes
padding,所以Foo的大小由4字节增加到了8字节。面对这种情况,一种解决办法是通过继承来使用策略类,而不再将它们作为数据成员。代码如下:1template2class
2021年8月19日
其他
C++ DP.13-2 泛化实现Cyclic Visitor与强大的C++17 std::visit
先附上最终实现:https://github.com/lkimuk/okdp/tree/master/visitor本文接上篇~~13.7泛化Cyclic
2021年7月8日
其他
C++ DP.09 Abstract Factory
tail_typeT::Type;head_type用于获取容器中的第一个类型,tail_type用于获取容器中的其余类型。我们还需要逆转类型顺序,
2020年9月18日
其他
C++ DP.08 Factory Method
switch的确被消除了,此时要想扩展新的产品,比如Lemon,只要添加一个新的LemonFactory,而无需修改原本的代码(OCP)。此外,若要切换产品为菠萝,你只需将new
2020年9月11日
其他
C++ DP.07 Singleton
Singleton模式从概念上看非常简单,[DP]上所述意图如下:保证一个类仅有一个实例,并提供一个访问它的全局访问点。然而实现起来却并非易事,甚至有些棘手。棘手之处在于删除问题,如何删除Singleton实例?谁来删除?何时删除?在[DP]中,并未探讨有关析构和删除的问题,这是GoF的疏忽。此模式虽小,内涵却多,随着观察的深入,问题便突显出来。之后,John
2020年8月30日
其他
C++17: Simplify Code with Fold Expressions
Expressions的基本概念C++11中,参数包只能在需要参数列表的上下文展开,比如函数递归。而递归函数需要终止条件,因此往往需要提供一个同名的函数来终止递归。举个例子:
其他
Uniform Initialization and initializer_list
Initialization(一致性初始化)。对于任何变量或对象,你都可以使用一个共有的语法,这个语法就是使用{}初始化。所以现在的初始化都可以这样写:1std::vector
2020年4月12日
其他
C++20 Coroutines:operator co_await
上篇介绍了C++20协程的诸多内容,独余co_await未曾涉及。co_await是协程中非常重要的一个关键字,用以支持挂起(suspend)和恢复(resume)的逻辑。本篇便专门来对其进行介绍。1.
2020年4月9日
其他
Demystifying C++20 Coroutines
在此处调用函数此函数返回一个字符串,可以直接进行输出。当调用函数时,只能等到函数执行结束才算结束调用。现在对表情进行扩展,1void
2020年3月8日