写点什么

C++ 学习 --- 类型萃取 ---std::integral_constant

作者:桑榆
  • 2022-11-22
    广东
  • 本文字数:1690 字

    阅读完需:约 6 分钟

背景

定义在<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  template<typename _Tp, _Tp __v>    struct integral_constant    {      static constexpr _Tp                  value = __v;      typedef _Tp                           value_type;      typedef integral_constant<_Tp, __v>   type;      constexpr operator value_type() const noexcept { return value; }      constexpr value_type operator()() const noexcept { return value; }    };
template<typename _Tp, _Tp __v> constexpr _Tp integral_constant<_Tp, __v>::value;
/// The type used as a compile-time boolean with true value. typedef integral_constant<bool, true> true_type;
/// The type used as a compile-time boolean with false value. typedef integral_constant<bool, false> false_type;
template<bool __v> using __bool_constant = integral_constant<bool, __v>;
template<bool __v> using bool_constant = integral_constant<bool, __v>;
复制代码

实现分析

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 类型,将在后面的类型萃取当中使用。

使用案例

#include <iostream>#include <type_traits>
int main(){ typedef std::integral_constant<int32_t, 33> int_value_33_t; typedef std::__bool_constant<true> my_true_t;
int_value_33_t test_value;
std::cout << "int_value_33_t:" << int_value_33_t::value << "\tcoversion function:" << test_value << "\tcaller function:" << test_value() << std::endl;
std::cout << std::boolalpha; std::cout << "std::true_type:" << std::true_type::value << std::endl; std::cout << "std::true_type:" << std::false_type::value << std::endl; std::cout << "my_true_t:" << my_true_t::value << std::endl;
return 0;}
复制代码

可以看到,这里我们定义了自己的类型 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,可以直接获取特定值类型,这几个特定的类型模板是类型萃取的基础类。

发布于: 刚刚阅读数: 3
用户头像

桑榆

关注

北海虽赊,扶摇可接;东隅已逝,桑榆非晚! 2020-02-29 加入

Android手机厂商-相机软件系统工程师 爬山/徒步/Coding

评论

发布
暂无评论
C++学习---类型萃取---std::integral_constant_C++ STL_桑榆_InfoQ写作社区