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

发表评论

Copy Protected by Chetan's WP-Copyprotect.