欢迎加入Modern C++ Meta-programming组织

purecpp社区将建一个专门讨论现代C++元编程的组织(注:不是c++98/03的元编程,是c++11/14/17的元编程),欢迎报名加入。
报名方式:
实现一个有5个算法的type_list,要有测试代码并能编译通过,将实现的代码发到purecpp@163.com邮箱,同时还有你的QQ号。如果审核通过之后会将你拉到专门的群。
期待你们的type_list, have fun!

C++17中的string_view

基本用法

C++17中的string_view是一个char数据的视图或者说引用,它并不拥有该数据,是为了避免拷贝,因此使用string_view可以用来做性能优化。你应该用string_view来代替const char和const string了。string_view的方法和string类似,用法很简单:

构造string_view的时候用char*和长度来构造,这个长度可以自由确定,它表示string_view希望引用的字符串的长度。因为它只是引用其他字符串,所以它不会分配内存,不会像string那样容易产生临时变量。我们通过一个测试程序来看看string_view如何来帮我们优化性能的。

我们可以通过字面量””sv来初始化string_view.
string_view的substr和string的substr相比,快了50多倍,根本原因是它不会分配内存。

string_view的生命周期

由于string_vew并不拥有锁引用的字符串,所以它也不会去关注被引用字符串的生命周期,用户在使用的时候需要注意,不要将一个临时变量给一个string_view,那样会导致string_view引用的内容也失效。

这样的代码是有问题的,因为出了作用域之后,string_view引用的内容已经失效了。

C++17中的structured bindings

基本用法

structured bindings让我们能通过tuple,std::pair或是没有静态数据成员的结构体来初始化变量。在C++17之前如果要解包一个结构体时,我们需要借助tie,像这样:

现在有了C++17的structured bindings,我们可以很方便地解包tuple了,像这样。

遍历map的时候也不用像以前一样写pair然后it->first, it->second了,而是用更加简洁的方式,像这样:

更酷的是你可以用来解包一个结构体。

需要注意的是,你必须提供和结构体或tuple字段个数相同的变量,否则会出现编译错误,而且你不能像std::ignore一样忽略某些字段,必须全部解包出来。解包的时候你可以选择引用或拷贝,auto&就是引用方式解包。

特殊用法

我们可以借助这个特性来做一点有趣的事,比如把一个结构体变成一个tuple。

实现的思路很巧妙,先判断某个类型是否由指定个数的参数构造,is_braces_constructible<type, any_type>{}就是判断type是否能由一个参数构造;接着通过constexpr if在编译期选择有效的分支,其它的分支将会被丢弃;最后通过structured bindings来获取结构体字段的值,并将这些值重新构造一个tuple,这样就可以实现将结构体转换为tuple了。上面的例子中由于有四个字段所以会走第一个分支。需要注意的是,这个方法只是一个示例,还没解决构造函数被delete的问题,还有隐式转换的问题,如果你想看更完整的解决方案可以看这里:http://playfulprogramming.blogspot.hk/2016/12/serializing-structs-with-c17-structured.html。

structured bindings具备解包结构体的能力,虽然限制条件也不少,我相信它的用法值得深入探索。

C++17中的constexpr

constexpr if

constexpr标记一个表达式或一个函数的返回结果是编译期常量,它保证函数会在编译期执行。相比模版来说,实现编译期循环或递归,C++17中的constexpr if会让代码变得更简洁易懂。比如实现一个编译期整数加法:

C++17之前你可能需要像上面这样写,但是现在你可以写更简洁的代码了

当然,你也可以用C++17的fold expression

constexpr还可以用来消除enable_if了,对于讨厌写一长串enable_if的人来说会非常开心。比如我需要根据类型来选择函数的时候:

经常不得不分开几个函数来写,还需要写长长的enable_if,比较繁琐,通过if constexpr可以消除enable_if了。

constexpr if让C++的模版具备if-else if-else功能了,是不是很酷,C++程序员的好日子来了:)

不过需要注意的是这种写法是有问题的哦。

这个代码把else去掉了,当输入如果是非数字类型的时候代码可以编译过,以为if constexpr在模版实例化的时候会丢弃不满足条件的部分,因此函数体中的前两行代码将失效,只有最后一句有效。当输入的为数字的时候就会产生编译错误了,因为if constexpr满足条件了,这时候就会有两个return了,就会导致编译错误。

constexpr if还可以用来替换#ifdef宏,看下面的例子

代码变得更清爽了,再也不需要像以前一样写#ifdef那样难看的代码块了。

constexpr lambda

constexpr lambda其实很简单,它的意思就是可以在constexpr 函数中用lambda表达式了,这在C++17之前是不允许的。这样使用constexpr函数和普通函数没多大区别了,使用起来非常舒服。下面是constexpr lambda的例子:

constexpr if和constexpr lambda是C++17提供的非常棒的特性,enjoy it.

中国的cppcon需要您的参与!

为什么要举办这样一个C++大会

C++标准在不断的发展和演进,从C++11到C++14,再到现在的C++17,还有接下来的C++20和C++23.历史的车轮一直在滚滚向前,C++这个有着三十多年历史的语言也在顺应着时代潮流不断地向前发展演进。C++语言正在发生着深刻的变革,这些变革给工业界带来了很多变化,比如让我们的程序变得更安全、更高效和更简洁,而这些新技术正在提高工业生产力,谁先掌握这些新技术会谁将会先享受到到新技术带来的红利。在美国,在欧洲,现代C++正在如火如荼的讨论和应用,每年在美国举办的cppcon无疑是工业界、学术界中水平最高的C++技术盛会,cppcon每年有超过2000人参会,上百位来自美欧的C++专家和高手分享和交流C++最新的技术和新的idea。

然而cppcon一直在美国举办,中国的C++爱好者想参与往往受限于距离和英文语言等因素不便参加。现在有一个好消息:purecpp社区将会在今年晚些时候参与举办一场高水平、国际化的C++大会,大会的形式和内容将会与cppcon类似但又具备中国特色,如果你不能亲自前往美国参加cppcon那么就不要错过这次在中国举行的C++大会。

举办方的资质

purecpp社区自2015年成立以来一直致力于现代C++的研究、应用和推广,在各大社区和《程序员》杂质发表了大量的技术文章,同时也开源了一批现代C++项目。purecpp社区的创始人祁宇在今年5月份参加了在美国举办的c++ now技术大会并在会上做了演讲,后面相关视频会放在youtube上。祁宇还将参加今年在华盛顿举办的cppcon2017, 将在会上做1小时演讲。作为深度的参会人员,他知道C++未来的发展方向,知道国际上正在研究的C++热点,也知道广大的C++er希望听到什么内容。cppcon和cppnow为人称道的原因就在于它们的专业性,因此,purecpp社区作为举办方之一就是希望在中国办一场cppcon那样专业的、受欢迎的C++大会。

大会的日程

大会的日期、地点和议程目前还没确定,需要您参与进来,我们希望知道一些基本信息:

  1. 有多少人愿意参加这次大会;
  2. 你想听关于哪些方面的内容;

有了这些条件之后我们才能更好地确定大会日程,请参与我们的调查(文末有一个调查表),这场C++盛会需要您的参与!

大会内容

我们希望这次大会能聚焦于现代C++(C++11/14/17)以及工业界热点,比如C++在人工智能领域、分布式数据处理引擎(GraphLab)领域、区块链领域的应用,当然最重要的是你创新的idea!!

就以Cppcon的主题作为这次大会的主题:

  1. C++ Best Practices
  2. Concurrent Thinking in C++
  3. Crafting Embedded Software in C++
  4. Modern C++ Template Programming
  5. Modernizing your C++
  6. Move Semantics: Everything You Always Wanted to Know, But Were Afraid to Ask
  7. Moving to C++17: The New Language and Library Features
  8. Debugging and Profiling C++ Code on Linux
  9. Exploring the C++ Standard Library
  10. Practical Modern C++
  11. Programming with Qt/Widgets
  12. The Standard Library from Scratch

如何报名

到时候报名的相关信息会放在purecpp.org上,敬请关注,先说一下讲师和观众的报名流程。

讲师报名流程

不管你是什么学历、什么公司、什么国家,只要你有和C++有关的创新的idea,你就可以报名!
讲师报名需要填一个报名表,类似于cppcon,你需要提供演讲者的信息、演讲的摘要信息和主要内容。如果你有很有说服力的证明材料就更好了,证明材料是能证明你演讲内容的代码或之前的ppt。

讲师报名的时间大概在两个月左右,报名阶段结束之后就是评审阶段。采取的是专家评审方式,由两名中国专家和两名外国专家对演讲内容进行评审,评审通过的讲师就可以参会了。无论评审通过与否我们都会告知报名者结果。

这次大会的外国讲师和中国的讲师比例大约为1:2。

观众报名流程

观众需要在官网上购票参会,具体等待后续的通知,学生的话会有折扣。

需要您的参与

 

iguana支持了C++17

iguana做了更新,增加了C++17的版本,之前C++14的版本并不受影响。

如何使用

如何使用C++17版本的iguana呢?很简单。

  1. 需要支持C++17的编译器:gcc7.1, clang4.0,由于vs2017只支持了很少的C++17特性,因此在vs2017上用不了C++17版本的iguana.

  2. 引用C++17版本的头文件,如include “json17.hpp”即可。

  3. CMakelists.txt中设置C++17的flag。

用到了哪些C++17的新特性?

主要用到了C++17的constexpr:constexpr if, constexpr lambda; fold expression, string_view, inline variable, nested namespace.

C++17用起来很舒服,enjoy it.

欢迎大家使用基于编译期反射的序列化引擎iguana

C++17中的Fold Expression

C++11中增加了一个新特性可变模版参数(variadic template),它可以接受任意个模版参数在参数包中,参数包是三个点…,它不能直接展开,需要通过一些特殊的方法才能展开,导致在使用的时候有点难度。现在C++17解决了这个问题,让参数包的展开变得容易了,Fold expression就是方便展开参数包的。

fold expression的语义

fold expression有4种语义:

其中pack代表变参,比如args,op代表操作符,fold expression支持32中操作符:

unary right fold的含义:

fold (E op …) 意味着 E1 op (… op (EN-1 op EN)).
顾名思义是从右边开始fold,我们来看一个具体的例子:

right fold的过程是这样的:(1+(2+(3+4))),从右边开始fold。

unary left fold的含义

fold (… op E) 意味着 ((E1 op E2) op …) op EN.

对于+这种满足交换律的操作符来说left fold和right fold是一样的,比如上面的例子你也可以写成left fold。

对于不满足交换律的操作符来说就要注意了,比如减法。

这次right fold和left fold的结果就不一样。

binary fold

Binary right fold (E op … op I) 意味着 E1 op (… op (EN-1 op (EN op I)))

Binary left fold (I op … op E) 意味着 (((I op E1) op E2) op …) op E2

二元fold的语义和一元fold的语义是相同的,看一个二元操作符的例子:

相信通过这个例子大家应该对C++17的fold expression有了基本的了解。

comma fold

在C++17之前,我们经常使用逗号表达式和std::initializer_list来将变参一个个传入一个函数。比如像下面这个例子:

这种写法比较繁琐,用fold expression就会变得很简单了。

这是right fold,你也可以写成left fold,对于comma来说两种写法是一样的,参数都是从左至右传入print_arg函数。

fold expression操作符的默认值

需要注意的是fold expression有三个操作符有默认值:

测试一下默认值:

通过这些例子可以看到fold expression确实简化了可变模版参数的展开,用起来更简单更灵活,可以基于fold expression写出更多优雅的代码,fold expression也增强了变参的威力。

Copy Protected by Chetan's WP-Copyprotect.