浅墨浓香

想要天亮进城,就得天黑赶路。
随笔 - 743, 文章 - 16, 评论 - 87, 阅读 - 53万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

随笔分类 -  深入应用C++11

优化代码与工程级应用
摘要:1. TupleHelper的主要功能 (1)打印:由于tuple中的元素是可变参数模板,外部并不知道内部到底是什么数据,有时调试时需要知道其具体值,希望能打印出tuple中所有的元素值。 (2)根据元素值获取索引位置:tuple接口中有根据索引位置获取元素的接口,根据元素值来获取索引位置是相反的做 阅读全文

posted @ 2017-11-18 23:27 浅墨浓香 阅读(1011) 评论(0) 推荐(0) 编辑

摘要:1. any类的实现 (1)any类: ①是一个特殊的,只能容纳一个元素的容器,它可以擦除类型,可以将何任类型的值赋值给它。 ②使用时,需要根据实际类型将any对象转换为实际的对象。 (2)实现any的关键技术 ①当赋值给any时,需要将值的类型擦除,即以一种通用的方式保存所有类型的数据。通常是通过 阅读全文

posted @ 2017-11-17 20:33 浅墨浓香 阅读(878) 评论(0) 推荐(0) 编辑

摘要:1. function_traits (1)function_traits的作用:获取函数的实际类型、返回值类型、参数个数和具体类型等。它能获取所有函数语义类型信息。可以获取普通函数、函数指针、std::function、函数对象和成员函数等的相关信息。 (2)实现function_traits的关 阅读全文

posted @ 2017-11-17 20:32 浅墨浓香 阅读(1183) 评论(0) 推荐(0) 编辑

摘要:1. dll帮助类 (1)dll的动态链接 ①传统的调用方式:先调用LoadLibrary来加载dll,再定义函数指针类型,接着调用GetProcAddress获取函数地址。然后通过函数指针调用函数,最后通过FreeLibrary卸载dll ②问题:使用dll的过程存在重复逻辑。此外,如果dll中的 阅读全文

posted @ 2017-11-12 23:57 浅墨浓香 阅读(1039) 评论(0) 推荐(0) 编辑

摘要:1. optional类的实现 (1)optional的功能 ①optional<T>的内部存储空间可能存储了T类型的值,也可能没有。只有当optional被T初始化之后,这个optional才是有效的。否则是无效的。它实现了未初始化的概念。 ②optional可以用于解决函数返回无效值的问题。当函 阅读全文

posted @ 2017-11-11 23:39 浅墨浓香 阅读(599) 评论(0) 推荐(1) 编辑

摘要:1. 模板参数包 (1)模板参数包的类型 ①类型参数包(Type parameter packs):如template<typname… T> class tuple; ②非类型参数包(Non-type parameter packs):如template<int…A> class Test{}; 阅读全文

posted @ 2017-11-11 13:56 浅墨浓香 阅读(2007) 评论(0) 推荐(1) 编辑

摘要:1. 可变参数模板函数 (1)递归函数方式展开参数包 ①一般需要提供前向声明、一个参数包的展开函数和一个递归终止函数。 ②前向声明有时可省略,递归终止函数可以是0个或n个参数 (2)逗号表达式和初始化列表方式展开参数包 ①逗号表达式按顺序执行,返回最后一个表达式的值。 ②initilizer_lis 阅读全文

posted @ 2017-11-05 14:01 浅墨浓香 阅读(4275) 评论(0) 推荐(2) 编辑

摘要:1. 参数包(parameter pack) (1)模板参数包(以tuple为例):template<typename… Elements>class tuple ①Elements标识符的左侧使用了省略号,在C++11中Elements被称为“模板参数包”,表示可以接受任意多个参数作为模板参数。 阅读全文

posted @ 2017-11-04 21:42 浅墨浓香 阅读(1428) 评论(0) 推荐(1) 编辑

摘要:1. std::conditional (1)原型:template <bool Cond, class T, class F> struct conditional; //根据条件获取T或F类型 template<bool Cond, class T, class F> //泛化 struct c 阅读全文

posted @ 2017-11-04 09:37 浅墨浓香 阅读(1803) 评论(0) 推荐(2) 编辑

摘要:1. 获取可调用对象返回类型 (1)decltype:获取变量或表达式的类型(见第2课) (2)declval及原型 ①原型:template<class T> T&& declval();——函数模板,返回值T&& ②decltype的局限性:如果模板参数无构造函数,就不能构造出对象,也就无法获取 阅读全文

posted @ 2017-11-02 22:10 浅墨浓香 阅读(1692) 评论(0) 推荐(1) 编辑

摘要:1. type_traits类型萃取 (1)type_traits通过定义一些结构体或类,并利用模板类特化和偏特化的能力,给类型赋予一些特性,这些特性根据类型的不同而异。在程序设计中可以使用这些traits来判断一个类型的一些特性,引发C++的函数重载机制,实现同一种操作因类型不同而异的效果。 (2 阅读全文

posted @ 2017-11-01 18:53 浅墨浓香 阅读(4481) 评论(0) 推荐(2) 编辑

摘要:1. std::forward原型 2. 完美转发(Perfect Forwarding) (1)完美转发:是指在函数模板中,完全依照模板的参数类型(即保持实参的左值、右值特性),将实参传递给函数模板中调用的另外一个函数。 (2)原理分析 (3)std::forward和std::move的联系和区 阅读全文

posted @ 2017-10-27 12:32 浅墨浓香 阅读(5010) 评论(0) 推荐(0) 编辑

摘要:1. std::move (1)std::move的原型 (2)std::move的作用 ①std::move函数的本质就是强制转换,它无条件地将参数转换为把一个右值引用,又由于函数返回的右值引用(匿名对象)是一个右值。因此,std::move所做的所有事情就是转换它的参数为一个右值。继而用于移动语 阅读全文

posted @ 2017-10-26 21:54 浅墨浓香 阅读(1472) 评论(1) 推荐(2) 编辑

摘要:1. 左值和右值 (1)两者区别: ①左值:能对表达式取地址、或具名对象/变量。一般指表达式结束后依然存在的持久对象。 ②右值:不能对表达式取地址,或匿名对象。一般指表达式结束就不再存在的临时对象。 (2)右值的分类 ①将亡值(xvalue,eXpiring value):指生命期即将结束的值,一般 阅读全文

posted @ 2017-10-20 11:43 浅墨浓香 阅读(4709) 评论(2) 推荐(1) 编辑

摘要:1. lambda的语法形式:[capture](params) opt -> ret {body;}; (1)capture为捕获列表 ①[]、[&]和[=]分别表示不捕获、按引用捕获、按值捕获所有父作用域中内的局部变量。(父作用域指包含lambda表达式的语句块,如main函数)。 ◆lambd 阅读全文

posted @ 2017-10-14 13:34 浅墨浓香 阅读(891) 评论(1) 推荐(2) 编辑

摘要:1. std::function (1)首先是一个类模板,用于包装可调用对象。可以容纳除了类成员(函数)指针之外的所有可调用对象。 (2)可以将普通函数,lambda表达式和函数对象类统一起来。尽管它们并不是相同的类型,但通过function类模板,可以转化为相同类型的对象(function对象), 阅读全文

posted @ 2017-10-07 18:08 浅墨浓香 阅读(880) 评论(0) 推荐(0) 编辑

摘要:1. 温故知新:std::bind1st和std::bind2nd (1)bind1st、bind2nd首先它们都是函数模板,用于将参数绑定到可调用对象(如函数、仿函数等)的第1个或第2个参数上。 (2)函数的返回值是一个函数对象。它用于包装和改造传入的函数(或仿函数),并形成一个新的仿函数对象(是 阅读全文

posted @ 2017-10-07 12:09 浅墨浓香 阅读(732) 评论(1) 推荐(2) 编辑

摘要:1. 几种可调用对象(Callable Objects) (1)普通函数指针或类成员的函数指针 (2)具有operator()成员函数的类对象(仿函数)。如c++11中的std::function类模板,本质上就是一个仿函数。 (3)可被转换为函数指针的类对象(需要重载类型转换操作符operator 阅读全文

posted @ 2017-10-06 23:47 浅墨浓香 阅读(723) 评论(0) 推荐(1) 编辑

摘要:1. 基于范围的for循环(range-based for) (1)语法:for(decl : coll){//statement} ①decl用于声明元素及类型,如int elem或auto elem(让编译器自动推导集合中元素的类型),但应注意auto& elem和auto elem的区别,前者 阅读全文

posted @ 2017-10-05 20:34 浅墨浓香 阅读(1425) 评论(0) 推荐(0) 编辑

摘要:1. 防止类型收窄 (1)类型收窄:指的是导致数据内容发生变化或者精度丢失的隐式类型转换。 (2)类型收窄的几种情况: ①从浮点数隐式转换为整型数,如int i=2.2; ②从高精度浮点数隐式转换为低精度浮点数。如从long double转double或float。 ③从整型数隐式转换为浮点数,并且 阅读全文

posted @ 2017-10-05 10:35 浅墨浓香 阅读(2733) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示