码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++标准模板(STL)- 类型支持 (类型特性,is_pointer,is_lvalue_reference,is_rvalue_reference)


    类型特性

    类型特性定义一个编译时基于模板的结构,以查询或修改类型的属性。

    试图特化定义于 头文件的模板导致未定义行为,除了 std::common_type 可依照其所描述特化。

    定义于头文件的模板可以用不完整类型实例化,除非另外有指定,尽管通常禁止以不完整类型实例化标准库模板。

    类型属性

    定义于头文件

    基础类型类别

    继承自 std::integral_constant

    成员常量

    value

    [静态]

    若 T 为指针类型则为 true ,否则为 false
    (公开静态成员常量)
    成员函数

    operator bool

    转换对象为 bool ,返回 value
    (公开成员函数)

    operator()

    (C++14)

    返回 value
    (公开成员函数)
    成员类型
    类型定义
    value_typebool
    typestd::integral_constant

    检查类型是否为指针类型

    std::is_pointer

    template< class T >
    struct is_pointer;

    (C++11 起)

    检查 T 是否为指向对象指针或指向函数指针(但不是指向成员/成员函数指针)。若 T 是对象/函数指针类型,则提供等于 true 的成员常量 value 。否则, value 等于 false 。

    模板形参
    T-要检查的类型
    辅助变量模板

    template< class T >
    inline constexpr bool is_pointer_v = is_pointer::value;

    (C++17 起)
    可能的实现 
    1. template< class T > struct is_pointer_helper : std::false_type {};
    2. template< class T > struct is_pointer_helper<T*> : std::true_type {};
    3. template< class T > struct is_pointer :
    4. is_pointer_helper<typename std::remove_cv<T>::type> {};

    检查类型是否为左值引用

    std::is_lvalue_reference

    template< class T >
    struct is_lvalue_reference;

    (C++11 起)

    检查 T 是否为左值引用类型。若 T 是左值引用类型,则提供等于 true 的成员常量 value ,否则, value 等于 false 。

    模板形参
    T-要检查的类型
    辅助变量模板

    template< class T >
    inline constexpr bool is_lvalue_reference_v = is_lvalue_reference::value;

    (C++17 起)
    可能的实现
    1. template<class T> struct is_lvalue_reference : std::false_type {};
    2. template<class T> struct is_lvalue_reference<T&> : std::true_type {};

    检查类型是否为右值引用

    std::is_rvalue_reference

    template< class T >
    struct is_rvalue_reference;

    (C++11 起)

    检查 T 是否为右值引用类型。若 T 是右值引用类型,则提供等于 true 的成员常量 value ,否则, value 等于 false 。

    模板形参
    T-要检查的类型
    辅助变量模板

    template< class T >
    inline constexpr bool is_rvalue_reference_v = is_rvalue_reference::value;

    (C++17 起)
    可能的实现
    1. template <class T> struct is_rvalue_reference : std::false_type {};
    2. template <class T> struct is_rvalue_reference<T&&> : std::true_type {};

    调用示例

    1. #include <iostream>
    2. #include <type_traits>
    3. class A {};
    4. int main()
    5. {
    6. std::cout << std::boolalpha;
    7. std::cout << "std::is_pointer::value: "
    8. << std::is_pointer<A>::value << std::endl;
    9. std::cout << "std::is_pointer::value: "
    10. << std::is_pointer<A *>::value << std::endl;
    11. std::cout << "std::is_pointer::value: "
    12. << std::is_pointer<A &>::value << std::endl;
    13. std::cout << "std::is_pointer::value: "
    14. << std::is_pointer<int>::value << std::endl;
    15. std::cout << "std::is_pointer::value: "
    16. << std::is_pointer<int *>::value << std::endl;
    17. std::cout << "std::is_pointer::value: "
    18. << std::is_pointer<int **>::value << std::endl;
    19. std::cout << "std::is_pointer::value: "
    20. << std::is_pointer<int[10]>::value << std::endl;
    21. std::cout << "std::is_pointer::value:"
    22. << std::is_pointer<std::nullptr_t>::value << std::endl;
    23. std::cout << std::endl;
    24. std::cout << "std::is_lvalue_reference::value: "
    25. << std::is_lvalue_reference<A>::value << std::endl;
    26. std::cout << "std::is_lvalue_reference::value: "
    27. << std::is_lvalue_reference<A&>::value << std::endl;
    28. std::cout << "std::is_lvalue_reference::value: "
    29. << std::is_lvalue_reference < A&& >::value << std::endl;
    30. std::cout << "std::is_lvalue_reference::value: "
    31. << std::is_lvalue_reference<int>::value << std::endl;
    32. std::cout << "std::is_lvalue_reference::value: "
    33. << std::is_lvalue_reference<int&>::value << std::endl;
    34. std::cout << "std::is_lvalue_reference::value: "
    35. << std::is_lvalue_reference < int&& >::value << std::endl;
    36. std::cout << std::endl;
    37. std::cout << "std::is_rvalue_reference::value: "
    38. << std::is_rvalue_reference<A>::value << std::endl;
    39. std::cout << "std::is_rvalue_reference::value: "
    40. << std::is_rvalue_reference<A&>::value << std::endl;
    41. std::cout << "std::is_rvalue_reference::value: "
    42. << std::is_rvalue_reference < A&& >::value << std::endl;
    43. std::cout << "std::is_rvalue_reference::value: "
    44. << std::is_rvalue_reference<int>::value << std::endl;
    45. std::cout << "std::is_rvalue_reference::value: "
    46. << std::is_rvalue_reference<int&>::value << std::endl;
    47. std::cout << "std::is_rvalue_reference::value: "
    48. << std::is_rvalue_reference < int&& >::value << std::endl;
    49. std::cout << std::endl;
    50. return 0;
    51. }
    输出

  • 相关阅读:
    怎么把电脑上的文件备份到百度网盘?
    C++IO流
    AI大模型高速发展,Web3还远吗?
    队列的实现(c语言)
    「Redis数据结构」字符串对象String
    Python爬虫要掌握哪些东西
    Google Earth Engine(GEE)——全球人类居住区网格数据 1975-1990-2000-2014 (P2016)
    ES6解构赋值与扩展运算符
    提问:为什么整数乘于0.01小数会变成很多小数?java+js
    julia 笔记:复合类型 struct
  • 原文地址:https://blog.csdn.net/qq_40788199/article/details/134092929
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号