【C++】【源码解读】std::is_same函数源码解读

简介: 【C++】【源码解读】std::is_same函数源码解读参考下面一句静态断言:static_assert(!std::is_same<bool, T>::value, "vector<bool> is abandoned in mystl");静态断言优点:可以自定义断言失败之后的输出 便于debug找问题其中我们用到了std::is_same

【C++】【源码解读】std::is_same函数源码解读

cyouhuiquan.jpg

参考下面一句静态断言:

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

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

其中我们用到了std::is_same

点进is_same进行源码分析:

template<typename, typename> structis_same : public false_type { }; template<typename _Tp> structis_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> structintegral_constant { staticconstexpr _Tp value = __v; typedef _Tp value_type; typedef integral_constant<_Tp, __v> type; constexproperatorvalue_type()constnoexcept { return value; } #if __cplusplus > 201103L#define __cpp_lib_integral_constant_callable 201304constexpr value_type operator()()constnoexcept { 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> structis_same : public false_type { }; template<typename _Tp> structis_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

 

__EOF__

本文作者铃灵狗的水墨书香

本文链接:https://www.cnblogs.com/linglingdog/p/15874398.html

目录
打赏
0
0
0
0
48
分享
相关文章
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
115 2
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
46 0
|
4月前
|
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
237 6
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
137 1
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
352 5
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
250 0
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
328 6
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
88 3
|
9月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
115 0
C++ 多线程之线程管理函数
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问