分类目录归档:社区活动

purecpp社区第一期技术公开课(报名截止到1.5号)

背景

modern C++国外已经用得如火如荼了,而国内大多还处于观望阶段,modern C++应该被更广泛地应用。我作为modern C++的倡导者和实践者,希望通过一些技术培训,将最新的C++特性和新技术思想介绍给C++爱好者,让大家不仅仅能深入理解新特性,还能体会到新特性是如何解决一些难题,以及最佳实践。真心希望modern C++能走进更多的企业,让更多的C++开发者享受新标准带来的好处,本次技术公开课算是推广modern C++的一种尝试,看看实际效果如何,我会根据实际效果来决定未来是否继续开课。

课程介绍

本次技术公开课的主题是modern c++实现编译期反射。反射是一种根据元数据来获取类内部信息的机制,通过元数据就可以获取对象的字段和方法等信息。C#和java的反射机制都是通过获取对象的元数据来实现的。反射可以用于依赖注入、ORM对象-实体映射、序列化和反序列化等与对象本身信息密切相关的领域。比如,java的Spring框架,其依赖注入的基础是建立在反射的基础之上的,可以根据元数据获取类型的信息并动态创建对象。ORM对象-实体之间的映射也是通过反射实现的。java和c#都是基于中间运行时的语言,中间运行时提供了反射机制,所以反射对于运行时语言来说很容易,但是对于没有中间运行时的语言,要想实现反射是很困难的。

幸运的是使用modern c++的新特性和一些模版元编程技巧可以实现一种通用的非侵入式的编译期反射

课程面向的用户是C++中高级开发者,总共分为三次课程:

  1. C++11/14实现编译期反射的技术基础

  2. C++11/14实现编译期反射的实现

  3. C++11/14实现编译期反射的应用

第一次课主要内容

第一次课的主题是:C++11/14实现编译期反射的技术基础

这次课程是为后续课程做铺垫,介绍实现编译期反射所需要用到的一些新特性和一些元编程技巧。

主要内容为:

C++11特性

  • 完美转发
  • tuple
  • type_traits
  • 可变模版参数

C++14特性

  • constexpr
  • void_t
  • std::index_sequence
  • auto function
  • auto lambda
  • decltype(auto)

其他

  • 宏元
  • SFINAE

第二次课主要内容

主题:C++11/14实现编译期反射的实现
主要内容待定

第三次课主要内容

主题:C++11/14实现编译期反射的应用
主要内容待定

如何报名

将报名信息发到我的邮箱qicosmos@163.com, 报名信息包括:姓名,邮箱,电话,所在公司。

公开课以网络直播或者视频方式进行,报名费用为400,如果你听课之后发现完全听不懂,退还报名费。

具体的开课时间(在某一个周末或者晚上)我会通过邮件告知报名用户。

如果有企业用户需要modern c++技术咨询服务也可以联系我。

Trump和C++

在美国大选尘埃落定之际,我想聊聊Trump和C++,很多人也许会觉得奇怪,Trump这个新当选的美国总统和C++有啥关系吗,难道他是一位C++程序员?!其实此川普非彼川普,原来是一位叫Trump的C++程序员,他是Trump的粉丝,让我们来八卦一下这位C++界的川普吧。这是他的twitter
qq%e5%9b%be%e7%89%8720161109214839

他的图像就是新当选的美国总统Trump,说明他是支持Trump的粉丝。没想到之前一直不被看好的川普逆袭成功,本来想看看他的twitter上有没有相关的段子,结果没看到。从他的twitter看到,他还参加了今年的cppcon,他的演讲主题我还没查到,应该比较精彩。

qq%e5%9b%be%e7%89%8720161109214905

我之前并不知道C++界有一位Trump,是C++标准委员会的Mike Spertus告诉我的。这次参加C++及系统软件技术大会,晚上大家一起吃饭的时候,我坐在Andrei Alexandrescu和Mike Spertus旁边,和他们闲聊,聊到美国大选和川普。Mike说C++ Trump,我还挺吃惊,以为美国总统候选人和C++有什么渊源,后来听他解释才知道是这么回事。再聊聊美国大选,我问Andrei和Mike他们支持希拉里还是川普,Mike说Trump is crazy,还说希拉里的支持率远远超过Trump,认为Trump的机会不大。Andrei也赞同这个观点,看得出他们挺支持希拉里当选美国总统的,也挺有信心的。同桌的小伙伴问,如果Trump当选美国总统了,他们会怎么办。Mike说如果Trump真当选了,他只有接受现实了。没想到一语成谶,川普逆袭成功^_^。
qq%e5%9b%be%e7%89%8720161109214927

Mike还问我如果Trump当选了会对中国产生什么影响。我说川普当选会对中国等国家更友好。Andrei和Mike酒量不错,每人大概喝了五瓶啤酒,还说青岛啤酒在美国也很知名。
再分享一下C++之父在大会上的风采
qq%e5%9b%be%e7%89%8720161109215211

能聆听这位带领我们cpper前进的精神领袖的演讲,真的很激动,我坚信C++会越来越好,C++程序员的日子也会越来越美好!
希望明年能有机会在cppcon上和那位C++ Trump见面聊聊^_^

C++技术沙龙报名啦!

唯有技术干货才适合这样装B的场合,不止于走码观花,我们力求在每一个脑洞大开的背后,寻找被忽略的蛛丝码迹,继续我们的脑洞大开运动会,在C/C++的世界里做一个 英姿飒爽的骑士 — 致颜值高得不像实力派的攻城狮们。

主题:技术沙龙 — 牛人码面

时间:2015年12月5日,14:00 — 18:00

地点:金山软件大厦1楼VIP室(广东省珠海市吉大莲山巷8号金山软件大厦(519015) )

沙龙课题

  • 《C++17新特性带来的改善与影响》C++编译器开发工程师,<<深入理解C++11>>(第二版)作者   IBM 吴钊
  • 《Nginx 在windows系统下优化》开源项目 Nginx Openresty For Windows 的发起者,360互联网安全中心 张家柱
  • 《C++中使用golang的协程》实战派C++er大型分布式系统架构设计者 魅族科技 于洋子

内容&讲师介绍:

一、吴钊:IBM XL C++编译器开发工程师,目前主要从事Clang与IBM编译器的融合。对C++语言具有浓烈的兴趣,参与《深入理解C++11》(第二版)的编写,长期活跃于知乎社区C++与编译器板块,ID为蓝色。

内容简介:C++17将会是下一个C++标准,不同于C++14对C++11的小改进,这将会是一个大的标准发布。在该标准中,也将计划引入很多让人兴奋的特性,如有利于改善编译时间的Module System,有利于改善编译器模板错误信息诊断的Concept,文件系统、网络库(基于Boost ASIO)、协程、SIMD等,而我将在此次分享中将着重分享Module System和Concept这两个影响很深远的C++17新特性。

二、于洋子:魅族科技,Linux-C++工程师  在大型分布式系统的设计与开发方面有丰富的经验 魅族用户量百万级走向千万级的见证者。

内容简介:作为C++er的你, 是否曾羡慕golang协程极佳的开发效率,而面对自己异步回调满天飞的代码黯然神伤?是否曾羡慕golang\erlang这种并发语言可以很简单地利用多核CPU,

而对C++多线程编程的复杂性望而却步? 在沙龙分享开源项目cpp_features,帮助你利用C++的高性能的同时获得golang一般的开发效率.

KeyNote:

  1. 同步、异步、协程Demo
  2. C++协程
  3. 协程调度
  4. 阻塞网络IO
  5. 三方库
  6. 语法
  7. 其他特性
  8. 上层封装

三、张家柱:360互联网安全中心,开源项目 Nginx Openresty For Windows 的发起者。

内容简介:

1、概述:
与官网 windows 版本对比
子进程启动方式(主要的差异)
代码差异
2、共享内存
共享内存坑一(无法使用共享内存)&解决方案
共享内存坑二&解决方案
3、性能改进
单进程限制
1024 连接数限制
新的网络模型
大名鼎鼎的 IOCP模型
使用 WSAPoll 模型
4、其他
多实例的支持

报名邮箱:lvxuee@kingsoft.com(来信注明姓名+联系方式+擅长技术或领域)免费报名。

互动奖品:小米自拍杆、运动手环、小米充电宝、wifi放大器、小米音响。

活动流程:

项  目 人 员 时 间 备 注
《C++17新特性带来的改善与影响》 吴钊 14:00-14:50 IBM
下午茶 漂亮MM 14:50-15:00 糕点、水果、咖啡
《Nginx 在windows系统下优化》 张家柱 15:00-15:50 360互联网安全中心
抽奖 漂亮MM 15:50-16:00 试手气
《C++中使用golang的协程》 于洋子 16:00-16:50 魅族科技
圆桌交流 ALL 17:00-17:30 自由交流

填写报名信息:

 

对2015.05技术沙龙中江南群主“任性”故事的探讨

五月份技术沙龙第二场演讲中,江南群主讲述的第二个“任性”故事的一个细节引发了一些争议。经小生仔细观察,三位讲师都有使用到相同的技术,但是实现的方法都有所不同,本文特来对这一个问题做一次详细的研究。

众所周知,在C++中实现反射是一件很棘手的事情。但是在确保没有类型退化(decay)和没有隐式类型转换的干扰下,是用模板元编程的一些技巧可以帮助我们完成一些目标。比如判断某个类型中是否含有某个成员函数,本文中的类成员函数仅指非静态成员函数

现实的基本思想是“一瞥”( catch a glimps of )这个成员函数。一瞥实际上是编译期的某种计算,而不会生成实际的代码。例如非求值运算符( Unevaluated Operator ),重载解析模板特化。非求值运算符在C++98下只有sizeof,到了C++11标准又扩充了decltype,typeid和noexcept三个操作符。先来看看C++98的实现。

由于sizeof只能对类型大小求值,因此C++98的版本的基本思想就是利用SFINAE和重载决议,配合sizeof来计算函数返回类型的大小,而获知哪一个test函数是决议的结果。如果是返回One类型的test,那么可以判断出这个类型T含有命名为foo,返回类型为void且有一个形参为void的成员函数。

这里有两个问题。1. 是否含有成员函数foo,单单只知道成员函数名是不够的,还必须知道它的完整签名,如返回值(暂不考虑cv修饰符)。2. 重载解析的规则里面有讲,相同的形参和不同返回类型的重载函数是有歧义的。因此,我们只需要知道形参就足够了,而不需要知道其完整的签名。

问题一很好解决,就是啰嗦点,除了提供函数名称之外,所有的形参和返回值类型一并提供。在c++98中,想做到这一点更啰嗦。我们需要提供形参数目从1到N每种版本的实现,具体实现多少个N由类库作者自行估量。

第二个问题,我们要寻求其他的实现方法了。因为指向非静态成员函数的指针(pointer to non-static memeber function)的签名有返回值类型,还有cv修饰符。基本思路是,假装我们要调用这个成员函数。先看看实现。

sizeof(((T*)0)->foo()),这一句就是假装去调用这个函数并尝试去计算函数返回值的类型的大小。由于sizeof是非求值运算符,因此没有生成运行期的空指针调用foo的代码。从这里就能看出sizeof操作符已经心有余而力不足了。首先sizeof将类型映射到了类型大小,丢失了类型信息;其次sizeof无法对void求值,这也是这个实现版本的硬伤。总之小生受能力所限,一直无法在cpp98版本中寻求比较好的实现方法。拜求得道大神之不吝赐教。

到了c++11的时代,情况好了许多。decltype这个非求值运算符的出现,让C++98中实现has_member_foo的第二种思路得以实现。先看看实现代码。

基本思想同样是SFINAE和重载解析,配合非求值运算符。只不过换成了delctype运算符。相比于sizeof运算符,decltype保留了非求值表达返回类型的完整信息,更重要的是decltype也能对void计算,不会出现sizeof(void)的尴尬。

深入细节,我们来看看C++11的实现版本是如何一瞥foo的调用的。通常,我们在描述数学问题的时候,总是使用假设。这里类比之,“假设”有一个类型的实例,且“假设”有可列的实参的全部实例,“尝试”使用这些实例调用函数foo,让decltype演绎这次假设的返回值结果!由于decltype是非求值运算符,所以计算中对象不需要真正的实例,同样函数只需要声明而不需要函数体。std::declval就是这样的一个函数。在std命名空间中就是返一个universal reference,并没有函数体。std::decltype只能用于非求值的计算当中。小生认为这种实现是最为简单的,如果使用指向非静态成员函数的指针来实现还要考虑返回值和cv修饰符,而这一种是完全不用考虑的。

接下来扩展一下思路。

拓展思路-另外的实现方法。文章的开头提及到的非求值的编译期计算,除了非求值运算符和重载解析外,还有一个模板特化。那么是否可以通过模板特化来实现本文的需求呢?先来看看基本思路。has_member_foo的泛型实现,应当返回false,继承std::false_type即可。在某种情况下的特化继承std::true_type!听起来是不是很美好?!实现细节。首先,为了简化问题,先不考虑成员函数有形参的情况。元函数has_member_foo的第一个参数是T,要判断的类型,应该是雷打不动的。而我们需要额外的一个参数,为特化的实现所用。

先举一个例子。还记得元函数enable_if配合模板特化的技巧吗?元函数template <typename T> struct size_integral;只计算整形类型的大小,其他类型不做任何计算。看看实现的代码。

当编译器尝试使用某个类型T去实例化size_integral的时候,会实例化所有的特化版本,并决议最佳的匹配。如果T是一个整形,那么特化版本会选择;如果T不是整形,那么特化版本实例化替换失败,根据SFINAE,会匹配泛型的实例化版本。

现在的问题是,针对本文的需求,我们需要一个元函数工具,使得传递任意可列个C++参数类型给它,它始终导出一个void. 为了迎合上面给出的例子的形式,小生才选择void。于是我们构建一个这样的工具,其实现如下。

也有了本文需求的另外一个实现

如果decltype能够成功推导出voider_t中的类型,那么决议就会选择这个more specialized的版本;反之,就会选择泛化的版本。实现是不是更优雅了?使用模板偏特化减少了使用重载解析造成的额外代码,至少小生谨以为然。

只可惜目前的编译器都不支持这种实现,原因是因为voider元函数没有使用任何模板参数,而被编译期做了优化。C++委员会也有一个提案来解决这个问题,详见CWG 1558, treatment of unused arguments in an alias template specialization. 其中的原委,小生还不是很清楚,望闻得道大神指教。

拓展思路-易用性。江南群主在这个故事中也提到了,这个元函数只能针对某一个成员函数,换一个成员函数要重新实现一个,中间有重复代码。因此有了使用宏来生成代码的实现版本,详见江南群主ppt. 可是江南群主的版本必须“两步走”!先得使用宏声明,再使用。有没有什么方法可以使用一个宏就能搞定?经过小生的测试,仅在msvc平台下还有一个小坑,把宏写在函数体内似乎有点问题,始终都找不到这个模板,不知道其他平台如何。因此一定要把宏写在函数体以外。此外,还需要考虑命名空间的问题。其实易用性的实现就目前的C++标准还是有些不够。

鄙文先写到这里。对于C++1y技术感兴趣的同学请加入我们社区,加入QQ群296561497讨论,让C++的世界更美好。

C++技术沙龙主要内容

5月16日技术沙龙有三场主题演讲。

第一场演讲内容:C++11 Make life easier.

第二场演讲内容:玩转编译器,让编译器帮助我们构建“难用错”的类,在大工程批量修改时帮忙查错。

第三场演讲内容:C++的小魔法,使用 ML style pattern matching 轻松应对繁杂的业务逻辑

QQ图片20150508161749

精彩值得期待!!你还在等什么,快来报名吧。liantu

C++技术沙龙报名啦!

沙龙主题:C++魔法
关键字:C++之美,黑科技,神奇和魔力
内容:三场主题演讲和一场开放性话题讨论
时间:2015年5月16日下午2:00-6:00
地点:珠海金山办公软件1楼VIP厅,珠海市吉大景山路莲山巷8号金山软件大厦
参与方式:邀请和报名。报名方式:填写报名信息。

品c++甜点,喝下午茶,论编程之道。
探bit奥秘,舞动指尖,写程序诗篇。

报名需知:请填写真实的电话和姓名,以便我们联系您。入场的时候请携带身份证,验证身份证是为了防止猎头进入,望大家理解。这是一场纯粹的技术盛会!限定名额为40人,报满为止。

QQ图片20150508161749

liantu

 

C++技术大会

主题:C++甜点
关键字:C++的黑科技,神奇和魔力
内容:三场主题演讲和一场开放性话题讨论
时间:五月十六号下午2:00-6:00
地点:珠海金山软件
参与方式:邀请和报名。报名唯一方式:show me your code,代码评审通过即可参加,联系邮箱purecpp@163.com。

C++技术大会值得期待,正所谓:

品c++甜点,喝下午茶,论编程之道。
探bit奥秘,舞动指尖,写程序诗篇。

横批:show me the code

Copy Protected by Chetan's WP-Copyprotect.