std::is_same使用很简单 重点在于对源码的解读

参考下面一句静态断言:

static_assert(!std::is_same<bool, T>::value, "vector<bool> is abandoned in mystl");

静态断言优点:可以自定义断言失败之后的输出 便于debug找问题

其中我们用到了std::is_same

点进is_same进行源码分析:

  template<typename, typename>
struct is_same
: public false_type { }; template<typename _Tp>
struct is_same<_Tp, _Tp>
: public true_type { };

可以看出两种is_same分别继承于两个不同的结构体

再来看看false_type和true_type的定义:

typedef integral_constant<bool, true>     true_type;
typedef integral_constant<bool, false> false_type;

可以看出这两个来自于同一个结构体模版:integral_constant

继续看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; }
#if __cplusplus > 201103L #define __cpp_lib_integral_constant_callable 201304 constexpr value_type operator()() const noexcept { return value; }
#endif
};

下面的宏定义不用管

可以看出这个模版需要一个_Tp类 然后还需要一个非模版类型的参数_v 并且这个参数的类型和_Tp的类型相同 并且会把这个非模版类型参数_v赋值给结构体成员变量

记得我们最开始调用is_same时

static_assert(!std::is_same<bool, T>::value, "vector<bool> is abandoned in mystl");

原来断言的就是这个value的值(一定是个bool且必须是个bool)

回到上一步false_type和true_type的定义:

typedef integral_constant<bool, true>     true_type;
typedef integral_constant<bool, false> false_type;

可以看出实际上是起了两个别名 true_type结构体中包含的value成员变量一定是true flase_type结构体中包含的value成员变量一定是false 我们需要断言的也就是这个value的值 再往回导一步:

  template<typename, typename>
struct is_same
: public false_type { }; template<typename _Tp>
struct is_same<_Tp, _Tp>
: public true_type { };

这个是模版调用优先级的问题 实际上 当传入相同类型的参数时(std::is_same<bool, bool>)此时会直接调用下面的is_same 反之如果两个类型不同 则会调用上面的is_same

所以最开始我们的调用:

static_assert(!std::is_same<bool, T>::value, "vector<bool> is abandoned in mystl");

这里的实际要求是不能传入bool类型的变量 即vector不接受bool类型

这设计思路真的很棒

源码地址是github上开源的自己手写STL

最新文章

  1. SQL Server里在文件组间如何移动数据?
  2. Wpf 中的DataGrid的Header属性,动态bind时不起作用
  3. ffmpeg-20160527-git-bin
  4. 创建Struct2的web应用(一)
  5. RobotFrameWork webservice soap接口测试 (二)
  6. JS:checkFrom对输入框和文本框的判断总结
  7. CodeIgniter 3之Session类库(3)(转)
  8. java中的线程创建和使用
  9. vc/mfc获取rgb图像数据后动态显示及保存图片的方法
  10. iOS Launch Images name
  11. 自己写的一个banner动画
  12. 那么温暖http合约,入门。
  13. OvS: data structure analysis
  14. Cookie和Session的区别、优缺点
  15. 环信 之 iOS 客户端集成一:导入库
  16. 丑数(USACO)
  17. vijos1090题解
  18. 关于WPF添加右击ContextMeun,以及获取所绑定控件的源
  19. linux系统调用之进程控制
  20. PXC添加新节点

热门文章

  1. Frp内网穿透搭建,家庭主机对外提供接口,支持ssh访问
  2. C++ switch 语句的用法
  3. 浏览器Cookie无法删除问题
  4. c#16进制转浮点数单精度类型
  5. [算法笔记-题解]问题 D: 习题4-4 三个整数求最大值
  6. [opencv]使用g++编译opencv程序演示
  7. 「会员卡管理系统」 · Java Swing + MySQL JDBC开发
  8. 树形DP总结基础
  9. elasticsearch之警惕inner hits的性能问题
  10. AWS修改RDS时区