标签分类:C++

再看设计模式——访问者模式

visitor模式优势在于双分派 dual dispatch 原始实现: 消息Visitable接口定义一个结构方法:accept(visitor v) { v.visit(this); } 访问者Visitor接口定义处理方法:visitor(具体类型) { 具体逻辑 } 使用者调用:具体类型.accept(v); 这个结构缺点在于新增具体类型,还得修改访问者接口 Acyclic visitor …

阅读全文

c++11如何封装thread库

基本接口要求 要求std::thread的构造函数 但是OS的库函数定义为: 主要是接口中的entry,本身使用void*根本没带类型信息,难点在于要做到模板暴露出类型从而可以通用化 第一个问题:把f和args统统打包在一起做成一个void *结构 我们得从void* 中获取函数指针和参数指针,首先来个结构体定义真实指针类型 需要一个tuple,用于保存f和args,这样我们就可以通过将void …

阅读全文

volatile与内存屏障总结

一. 内存屏障 Memory Barrior 1.1 重排序 同步的目的是保证不同执行流对共享数据并发操作的一致性。在单核时代,使用原子变量就很容易达成这一目的。甚至因为CPU的一些访存特性,对某些内存对齐数据的读或写也具有原子的特性。但在多核架构下即使操作是原子的,仍然会因为其他原因导致同步失效。 首先是现代编译器的代码优化和编译器指令重排可能会影响到代码的执行顺序。 其次还有指令执行级别的乱序 …

阅读全文

每周精选技术文章心得 Vol.2-20180603

本周开始除了每日的微信公众号闲来无事的阅读,周末时候再加入些以前知乎或微博收藏的文章来阅读,做到慢慢消化些碎片知识吧。 星期日(知乎特别篇): C++的奇特写法int b = 4[a];,可以用来做type trait/constraint,用来判断一个类型到底是一个重载了[ ](取下标)操作符的用户定义的类(比如vector),还是一个原生的数组或指针。当你的模板希望只处理原生数组或指针,而不希 …

阅读全文

C++中的局部类与嵌套类

局部类指在函数内部定义的类,自然局部类不能含有static成员,所有函数定义也必须在定义体内完成。基本不会使用。

嵌套类指在类内部定义类,该类名只能在外围类中使用,嵌套类中的函数成员可以在定义体外定义(但是需要使用限定符以使用类名),嵌套类中申明的成员不是外围类对象的成员,反之亦然。

因此分析访问关系时,完全可以当做非嵌套类处理,即嵌套类无法访问外围类的私有成员,也不能对外围类中定义的私有嵌套类创建对象,嵌套类可以访问static private成员,嵌套类中申明的友元也不能访问外围类中的私有成员。