remove_cv
remove_cv 这个模版类能够帮我们去掉类型的const,他的实现很简单,即使用模版元技术:
1 | template <class T> struct remove_cv{ typedef T type; }; |
这个代码应该非常容易理解,remove_cv的模版是一个T,我们对他做模版偏特化,将const 和volatile分离,然后使用::value就可以得到没有const、volatile的类型了,所以这个类也叫remove_cv。
is array
is array的实现非常简单,我们先假设所有的都不是array,即如第四行所示,然后利用偏特化,特判掉所有的array即可,让他们继承true_type,这样我们在使用的时候用::value即可判断。
1 |
|
integral_consant
这也是一个模版元技术,他储存了自己的类型,模版的类型,模版的值的类型,他的实现如下
1 | template <class T, T val> |
这里很明显了,value是值,value_type是value的类型,type是自己的类型。
true_type false_type
这里就很有意思了,看看就懂
1 | typedef integral_constant<bool, true> true_type; |
可能有人会问这个有什么用,其实这样的,很多时候我们需要为我们的类添加一个value,表示true或者false,正常的实现方法是写两遍,一遍处理全部,另一遍特化false,这样写的话,代码复用就太low了,这时候,其实我们只需要实现一遍基类,派生的时候一个继承true,另一个继承false就OK了。
is_function
这个代码就nb了,我还没看懂,先留个坑,我猜了一下,大概是用来判断一个类型是否是函数指针的。
remove_bounds
这个模版元我还真没猜出他的功能,话说怎么可能有人想得到这个bounds指的是数组的bounds呢?这个模版元的功能是传入一个数组,传出他的内容,即将T[]映射为T。注意: remove_bounds就是remove_extent。
1 | template <class T> struct remove_extent{ typedef T type; }; |
还是老样子,数组就特判掉,然后返回其头,否则就返回他的本身。
remove_reference
这个名字就很棒,就是移除引用的意思。同样他也是模版元技术,他先将所有的类型映射为自己,然后通过模版偏特化的方式将那些引用映射为本身。这里有一个c++的特性即下面代码
这个代码看懂的人应该不多了。
1 |
|
这里的&&就是右值引用的意思,所以输出是
1 | & |
然后我们来看源码
1 | namespace detail{ |
同样的我们使用模版元技术,将引用就消除了。
decay
这个模版元的意思是移除引用、移除const、移除volatile、数组移除范围、函数变成指针。
1 | namespace detail |
实际上做起来的时候是先移除引用,最后移除cv的。
any
如{ post_link ‘Boost-学习笔记2-Boost-Any’ Any接口学习 }所示,any能够支持我们的c++向python一样,给一个变量瞎赋值,这也太爽了。
构造函数如下
1 | template<typename ValueType> |
这里是接受任意的类型,然后对这个类型使用decay得到他的基本类型,最后让holder来替我们管理。holder保持了一个输入参数的副本,我们发现这个holder类型的值放到了一个叫content的指针中。
holder
holder继承自placeholder,placeholder是一个接口,我们不去管他,holder内部的副本保存在held中。
1 | template<typename ValueType> |
any数据类型的读取
any数据有两种读取方式,一是指针,想要读取出里面的元素,显然元素是operand->content->held, 我们要得到他的指针的话,先构造出指针来: holder<remove_cv<ValueType>::type>*, 因为operand->content是placeholer,这也就是为什么下面的代码的括号在->held之前的原因。最后用boost::addressof取出地址就可以了。
1 | template<typename ValueType> |
第二种方式是读取拷贝,先移除引用,调用上面的指针读取,最后指针取内容就可以返回了。
1 | template<typename ValueType> |
any的成员函数
前两个就不说了,直接说第三个,如果content存在,就调用content的type
1 | bool empty() const BOOST_NOEXCEPT |
type是这样实现的
1 | virtual const boost::typeindex::type_info& type() const BOOST_NOEXCEPT |
- 本文作者: fightinggg
- 本文链接: http://fightinggg.github.io/yilia/yilia/Q7BSO7.html
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!