首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【笔记】《深入理解C++11》(上)

阅读并笔记途中我跳过了一些之前已经总结过内容, 而对于一些自己看书后依然没搞清楚内容(例如SFINAE和内存模型)搜索资料进行了扩展, 还补充了一些原书没有介绍但稍微有所相关内容, 参考文献每一段开头给出...C相同结构体模型....没有继承关系) 类第一个非静态成员类型要与基类不同(为了类指针能直接指向第一个成员) 没有虚函数和虚基类 所有非静态成员都满足POD布局(递归定义) 之所以C++11引入POD概念是为了保证我们可以安全地用...memset和memcpy来对POD操作, 方便C/C++混编 而且POD保证了静态初始化安全有效, 可直接在内存级别赋0 我们可以用标准库is_trivial::value来判断一个类是否Plain...v=mNxAqLVIaW0 C++模板进阶指南:SFINAE https://zhuanlan.zhihu.com/p/21314708 Substitution Failure is not an Error

1.8K20
您找到你想要的搜索结果了吗?
是的
没有找到

C++设计模式之SFINAE:用来检测类是否有某个成员函数

针对类特定成员函数检测其实在工作也可能用到。C++可以用SFINAE技巧达到这个目的。...SFINAE是Substitution Failure Is Not An Error缩写,直译为:匹配失败不是错误。属于C++模板编程高级技巧,但属于模板元编程基本技巧。...当然我其实也并不是C++元编程方面的专家,只是搜集过一些常见实现方式,然后做过一些测试。在这个过程,我发现有些常见SFINAE写法是有问题,下面探讨一下。...两个Helper类模板参数。第二个参数为 push_back函数指针类型。之所以弄了两个Helper,是因为std::stringpush_back参数为char。...因为网上能找到各种SFINAE实现版本,很多对于push_back检测都是有问题。 而以上列举这两种,都能准确检测出string、vector、listpush_back()。

3.2K20

C++模版本质

C++模版诞生 程序 = 数据结构 + 算法 ---Niklaus EmilWirth 程序本质是数据结构+算法,任何一门语言都可以这样理解,这个公式对计算机科学影响程度足以类似物理学爱因斯坦...(数据结构)和算法,并且能很好在一起配合,这就需要它们既要相对独立,又要操作接口保持统一,而且能够很容易被别人使用(用到实际类),同时又要保证开销尽量小(性能要好)。...程序=数据结构+算法 算法就是对容器操作,对数据结构操作,一般算法设计原则要满足KISS原则,功能尽量单一,尽量通用,才能更好和不同容器配合,有些算法属于控制类算法(比如遍历),还需要和其他算法进行配合...这发生在尝试调用函数、取函数模板地址时,和某些其他语境; 函数模板进行实例化后会进行函数重载解析, 此时函数签名不包括返回值(template argument deduction/substitution...SFINAE -Substitution failure is not an error 要理解这句话关键点是failure和error模板实例化中意义,模板实例化时候,编译器会用模板实参或者通过模板实参推导出参数类型带入可能模板集

1.7K30

【CMU15-445 FALL 2022】Project #1 - Buffer Pool

判断是否是可驱逐,不可驱逐,也不能删除。 根据该帧访问次数,判断从历史队列删除还是缓存队列删除。 更新可驱逐帧数量。...删除哈希表映射记录,删除LRU-K替换器记录,重置对应page信息,将该frame_id放到空闲队列。...& constexpr if enable_if 以下内容来源于ChatGPT C++enable_if是一个模板元编程工具,用于在编译时根据条件来选择是否启用或禁用特定函数模板。...---- different constexpr if 和 enable if 是两个不同C++特性,用于在编译时根据条件选择代码路径,但它们语法和使用上有一些区别。...enable if 适用于需要在模板函数根据类型或条件启用或禁用特定实例化情况。它通常用于模板函数重载和模板参数限制。

24130

C++POD类型

C++ POD类型 背景 POD(Plain Old Data)指的是C++定义和C相兼容数据结构。...几乎所有的系统底层都是用C写,当时定义基本数据类型比如int、char、float、枚举、指针、数组和结构等通过二进制拷贝后还能保持数据不变,即编译器可以通过二进制数据将该类型正确解析出来。...C++类类型引入了继承和派生等新概念,编译器无法解析这些复杂数据结构,因此C++提出POD数据结构概念用于兼容C语言,由于C++基本内置类型都是POD类型,因此我们一般讨论class、struct...POD类型优势 1. C内存布局兼容 POD类型兼容C内存布局,C++可以直接使用C库函数操作POD数据类型,POD类型C和C++操作总是安全。 2....POD类型判断 C++,可以通过is_pod::value来判断某个类型是否是POD类型。

2.7K41

聊聊结构化绑定

所有非静态数据成员都必须是public访问属性,全部E,或全部E一个基类(即不能分散多个类)。identifier-list按照类中非静态数据成员声明顺序绑定,数量相等。...也就是说,方括号前面的修饰符都是作用于e,而不是那些新声明变量。至于为什么第一条会独立出来,这是因为标准C++第二条形式不能用于数组拷贝。...面向底层C++编程中常用union和位域(bit field),结构化绑定支持这样数据成员。...C++不存在位域指针和引用,但结构化绑定可以是指向位域左值: #include struct BitField { int f1 : 4; int f2 :...elision),保证NRV(named return value)优化;•constexpr if,简化泛型代码,消除部分SFINAE;•初始化条件分支语句:语法糖,使代码更加优雅。

23910

C++雾中风景18:C++20, 从concept开始

image.png 群里一个问题 SFINAE 熟悉C++模板编程小伙伴肯定第一时间想到通过SFINAE方式来解决,让笔者来解决这个问题的话,会写出下面的代码: template <typename...,Cal代表着一个concept实现,requires花括号内容就代表了对于类型T约束,要满足下面的操作符 a + a; a - a; a * a; a / a; Bingo!...requires后面可以任意concept concept使用 了解了concept定义之后,我们就可以利用concept来进行模板类型约束了。...这是笔者最认可一种书写方式,语义明确,模板类型定义之后明确对它要求。 template T test(T a) { return a + a; } 2)....4.小结 C++一些模板推断错误常常让人抓狂。

1K00

现代C++SFINAE应用(小工具编写)

现代C++SFINAE应用(小工具编写) 0.导语 现在考虑这个输入: map mp{ {1, 1}, {2, 4}, {3, 9}...+ STL容器有很多,例如:map,vector等等,我们想要针对键值对map输出如下格式: key => value 针对不是键值对采用下面输出: (a, b) C++ STL针对map这种如果键值对...std::true_type { }; template inline constexpr bool is_pair_v = is_pair::value; 首先是一个模板结构体...,也就是第一个函数std::declval() << *ptr会出错,但是真正报错之前会去检测是否有重载函数,发现后面还有个output函数,最后决议不报错,这便是SFINAE...下面原理还是SFINAE来实现,当不是pair时候就调用第二个重载函数了,否则就是第一个。

1.1K20

Google C++ 编程风格指南(二):作用域

C++ 允许函数任何位置声明变量. 我们提倡尽可能小作用域中声明变量, 离第一次使用越近越好. 这使得代码浏览者更容易定位变量声明位置, 了解变量类型和初始值....类型指针、数组和结构体。...静态变量构造函数、析构函数和初始化顺序 C++ 是不确定,甚至随着构建变化而变化,导致难以发现 bug....所以除了禁用类类型全局变量,我们也不允许用函数返回值来初始化 POD 变量,除非该函数不涉及(比如 getenv() 或 getpid())不涉及任何全局变量。...综上所述,我们只允许 POD 类型静态变量,即完全禁用 vector (使用 C 数组替代) 和 string (使用 const char [])。

73330

重温C++设计思想

C++通常会做上面的操作1和2;JAVA会做上面的操作1和3,Python会做操作1、2、3 栈上分配和释放,只需要移动一下栈指针,由于后进先出执行过程,所以不可能出现内存碎片、 二、智能指针 C++...简单类型称为POD(Plain Old Data),有构造和析构函数称为非POD。...局限性现代处理器架构上是绝对有优势,缺点是复制对象开销大大增加,所以C++需要移动语义,而Java里根本没有。...如果自定义类型拷贝构造代价较高,则使用移动构造函数,并标其为noexcept,或者只容器中放置对象智能指针。 C++11提供emplace系列函数,是为了提升容器性能设计。...元素大小较小时候,他可以有效节约内存。 3.4 关联容器 c++关联容器(set,map,multiset,multimap)是有序,而在别的语言通常是无序。名字multi允许键重复。

1.6K247

浅谈 C++ 元编程

1.2 元编程 C++ 位置 C++ 语言 = C 语言超集 + 抽象机制 + 标准库 C++  抽象机制 (abstraction mechanisms) 主要有两种:面向对象编程 (object-oriented...根据 对象 (object)  C++ 类型,推导出对应数据库 关系 (relation) 中元组各个字段类型;将对 C++ 对象操作,映射到对应数据库语句上,并生成相应代码。...实际项目中,我们往往需要将 C++ 数据结构,和实际业务逻辑相关 领域模型 (domain model) 相互转化。... 和 T * 相互转换;最后这使得所有的指针 std::vector 就可以共享同一份实现,从而避免了代码膨胀。...但是,过度使用元编程,一方面会 增加编译时间,另一方面会 降低程序可读性。不过, C++ 不断地演化,新语言特性被不断提出,为元编程提供更多可能。

2.8K60

C++数据类型

简介 C++数据类型包括基本内置类型、复合类型和自定义数据结构。...基本内置类型:编译器内置基本类型,包括算数类型(字符、整型数、布尔值、浮点数)和空类型void 复合类型:基于其他类型定义类型,包括数组、C风格字符串、指针、引用、C风格结构体(POD)和联合体(...Union) 自定义数据结构:用struct或者class定义POD:Plain Old Data,用来表明C++中和C相兼容数据类型,C++可以用is_pod::value判断是否是...实际开发我们仅使用C++内置整型int,如果程序需要大小不同整型,那么: 合适情况下,推荐用size_t和ptrdiff_t 我们可以认为int至少32位,如果需要使用64位整数,那么使用...void*是一种特殊指针类型,可以存放任意对象地址,一般只能做如下操作: 拿void*指针和别的指针比较 作为函数输入输出 赋值给另一个void*指针 自定义数据结构 C++允许用户以类形式自定义数据类型

91420

C和C++哪个效率更高?

执行效率 从语言特性角度上来看,C++是C超集。 (C++) - C这部分语言特性中有很多会降低执行效率。...例如C++std::sort函数肯定比C语言中qsort快(因为template function优点),但是C++iostream系列又比Cprintf系列慢几乎3倍,但是由于C++标准库功能比...C语言大得多,许多时候我们可以用较少开发时间就在C++实现相同算法。...返回结构体对象:C++支持对于非POD执行返回拷贝优化,C99结构体由于都是POD,有的版本依然不能支持返回拷贝优化。...C++函数模版(operator <) vs C函数指针定义concept(qsort比较函数指针):本质是生成多份实例用空间换时间 VS 用函数调用解耦可复用代码和不可复用代码从而避免可复用代码产生多份实例

84700

C和C++哪个效率更高?

执行效率 从语言特性角度上来看,C++是C超集。 (C++) - C这部分语言特性中有很多会降低执行效率。...例如C++std::sort函数肯定比C语言中qsort快(因为template function优点),但是C++iostream系列又比Cprintf系列慢几乎3倍,但是由于C++标准库功能比...C语言大得多,许多时候我们可以用较少开发时间就在C++实现相同算法。...返回结构体对象:C++支持对于非POD执行返回拷贝优化,C99结构体由于都是POD,有的版本依然不能支持返回拷贝优化。...C++函数模版(operator <) vs C函数指针定义concept(qsort比较函数指针):本质是生成多份实例用空间换时间 VS 用函数调用解耦可复用代码和不可复用代码从而避免可复用代码产生多份实例

1.3K30

C++奇淫巧技之SFINAE

SFINAE 技术,即匹配失败不是错误,英文Substitution Failure Is Not An Error,其作用是当我们进行模板特化时候,会去选择那个正确模板,避免失败 看个具体例子...multiply,但是由于我们不知道multiplication_result,根据 Substitution Failure Is Not An Error ,于是我们就去选择函数 multiply 这种技术代码一个大用途就是在编译时期来确定某个...is_ptr函数,3个是接受不同指针参数,另一个则包括了其他所有参数, IntPtr 是一个变量指针 FooMemberPtr 是一个成员属性指针 FuncPtr 是一个函数指针 接着我们来看下...muduo 库一段代码: template struct has_no_destroy { template static char...,但是继承不同gcc版本上不一定成立,具体可以看:http://stackoverflow.com/questions/1966362/sfinae-to-check-for-inherited-member-functions

50930
领券