用C++11实现C++14的std::get,并且增加默认值功能

需求:

tupel 的 std::get<TYPE> 如果取了不存在的类型就返回一个默认的

首先来看get的实现:

这一段不用多解释,变参模板递归展开,用枚举value的值来指明C++11中std::get<N>的N值,此时get非tuple包含类型会编译错误,这是合理的,现在就要动点手脚让它满足需求

为了满足需求,对get的改动如下(感谢社区mogu提供的方法):

在参数末尾构造了一个T的临时对象,每次get的时候会预先把这个T对象添加到临时创建的一个新tuple里面,很巧妙的,如果是原tuple内的类型会正确返回,如果不是就会匹配到新添加进去的这个从而返回。

不过,需要注意的是新添加进去的这个仅仅是临时对象,它只能保证编译通过,返回的默认类型对象依然析构,所以不要尝试去使用它,当然如果传了生命期足够参数进去就没有问题。

发表评论

Copy Protected by Chetan's WP-Copyprotect.