分类目录归档:代码精粹

祝程序猿们节日快乐

又到1024了,怎么过程序猿节呢,还是写一段有趣的代码来庆祝这个节日吧。
这段代码可以保证你的程序永远只输出1024,无视数字的顺序,并且能在程序运行之前就发现你的错误,保证你永远不会犯错, 杜绝bug:)
也许只有c++才有这样的魔力了,have fun programmers。

有趣的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。

a constant-expression counter in C++

来源:http://b.atch.se/posts/constexpr-counter/

在变参展开的同时,展开另外一个变参

展开过程是先展开里面的变参,再展开外面的变参。
代码来自:http://arne-mertz.de/2016/11/more-variadic-templates/

C++14实现c++17的make_from_tuple

//test code

让boost.variant的visit支持lambda

先来看看boost.variant的visit是怎么用的

需要定义一个visitor 函数对象,内部定义对应的operator。
如果不想定义这样的函数对象,直接通过lambda去访问该怎么做呢?
下面是实现代码,代码实现来自于这里和boost.hana.

根据value来获取tuple中的索引

根据值获取索引

测试结果

boost序列化std::tuple

由于boost的序列化默认不支持std::tuple,所以需要通过一个扩展来实现std::tuple的序列化。

测试代码

通过递归模版也可以实现

普通函数转换为函数对象(function to functor)

如果要把一个普通的函数转换为函数对象该怎么做,比如我希望将一个globle_func(…)函数转换为函数对象,std::bind也可以将函数转化为函数对象,但是bind不够通用,使用的时候它只能绑定有限的参数,如果函数本身就是可变参数的就无法bind了,所以,这个函数对象必须是泛化的,类似于这样:

通过一个functor包装起来,调用的时候实际上是调用globle_function,这样是没问题的。但是,如果其他的函数也需要转换为函数对象呢,如果都按照这样方式去做显然存在大量重复的代码和操作,可以用宏来简化functor的定义。

测试代码

我们先定义了一个宏,这个宏根据参数来生成一个可变参数的函数对象,这个函数对象的类型名为tfn_加普通函数的函数名,之所以要加一个前缀tfn_,是为了避免类型名和函数名重名。define_functor_type宏只是定义了一个函数对象的类型,用起来略感不便,还可以再简化一下,让使用更方便。我们可以再定义一个宏来生成转换后的函数对象。

make_globle_functor生成了一个可以直接使用的全局函数对象,使用起来更方便了。

Copy Protected by Chetan's WP-Copyprotect.