有趣的void_t

C++17里有一个新特性void_t,它是一个别名模版,具体的定义是:

void_t的模版参数是可变模版参数,所以可以能有任意个type,它主要是帮我们简化sfinae机制。比如我们想要写一个is_smart_pointer的trait,借助void_t可以很容易实现,下面是is_smart_pointer在rest_rpc中的实现。

如果对象存在指针访问符->和get方法,我们就基本认为这是一个smart_pointer, 如果你不太放心你还可以继续加判断条件,像这样

只要在后面再增加一个reset函数的判断,这样就更放心了,这就是void_t的魔力,让我们的代码更简单更灵活了。
如果要在c++14中使用这个特性该怎么办呢,自己实现一个void_t,也很简单:

需要注意的是这个实现只能在c++14中支持,在c++11中并不支持。因为,别名模版中的模版参数在c++14之前是不保证参与SFINAE并被忽略的,C++14在标准中明确了这一点.
详细的代码可以参考rest_rpc

perfect forward in lambda

C++14中有一个新特性叫move capture, 允许在lambda表达式中使用move方式捕捉变量,下面是move capture的一个例子。

之前只能捕获引用和值,捕获值有时候不方便,会导致额外的拷贝,现在支持move capture了,避免了不必要的拷贝。
我想介绍的是基于move capture的perfect forward,这会让我们的代码变得更加简洁。比如我有时候不太确定参数是左值引用还是右值引用,但希望像左值引用时按照左值引用捕获,右值引用的时候move capture。你不需要专门区分他们了,只需要用perfect forward就行了。rest_rpc正是用了perfect forward来实现了一个更加易用的timax::bind。

Copy Protected by Chetan's WP-Copyprotect.