C++ 学习 --- 类型萃取 ---std::integral_constant
背景
定义在<type_traits>中,指定了一个特定类型的常量,是<type_traits>类型萃取中很基础的类型,在模板编程中有很重要的地位。
代码实现
gcc 官网:https://gcc.gnu.org/
gcc 代码下载:https://mirrors.tuna.tsinghua.edu.cn/help/gcc.git/
gcc 版本代码:gcc-7.5.0(branch 分支)
文件位置:gcc/libstdc++-v3/include/std/type_traits
注意:以下的代码实现省略了一些宏定义部分,实际的代码还是参考 gcc 源码,这里仅用作相关原理分析。
实现分析
integral_constant 定义
从上面代码中我们可以看到,实际上 integral_constant 的作用就是存储一个特定类型的常量的值,结合类型萃取的原理,这里使用了类模板进行定义。其中:
value_type 被重命名为该特定类型;
type 被重命名为该模板类本身的类型;
value 用来存储该全局常量。
同时,还定义了两个常量表达式函数:
该特定类型的类型转换函数,直接返回存储的特定常量;
调用运算符重载函数,直接返回存储的特定常量。
value 常量定义
这里还将对应该特定类型的特定值存储变量,使用类模板的方式进行定义,表明该变量全局可见。
true_type
定义 bool 变量的 true 值,后续将会有很多部分使用到该类型,可以直接返回 true。
false_type
定义 bool 变量的 false 值,后续将会有很多部分使用到该类型,可以直接返回 false。
bool_constant
integral_constant 模板的一个具体使用,即_Tp 为具体的 bool 类型,将在后面的类型萃取当中使用。
使用案例
可以看到,这里我们定义了自己的类型 int_value_33_t(里面只存储了一个 int32_t 的常量数据 33),使用__bool_constant 定义了自己的 my_true_t。
在变量打印时,对于 int_value_33_t,我们可以通过访问类成员(static 成员变量)的方式,也可以通过定义一个变量 test_value,通过它的类型转换函数,调用符重载获取到这个存储的常量信息。
对于 bool 类型的变量,调用也是相同的,这里就不重复说明了。
总结
integral_constant 通过定义一个特定类型特定值的类型模板,可以构造一个含有特定值的类型,外部可以通过类成员变量,类型转换函数,调用运算符获取到该特定值;其中 bool 类型设定了 true_type 和 false_type,可以直接获取特定值类型,这几个特定的类型模板是类型萃取的基础类。
版权声明: 本文为 InfoQ 作者【桑榆】的原创文章。
原文链接:【http://xie.infoq.cn/article/17d8368cfa42b4c6c94944a0e】。文章转载请联系作者。
评论