• C++标准模板(STL)- 类型支持 (类型特性,is_union,is_class,is_function)


    类型特性


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

    试图特化定义于 头文件的模板导致未定义行为,除了 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_union

    template< class T >
    struct is_union;

    (C++11 起)

    检查 T 是否为联合体类型。若 T 为联合体类型,则提供等于 true 的成员常量 value 。否则 value ,等于 false 。

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

    template< class T >
    inline constexpr bool is_union_v = is_union::value;

    (C++17 起)

    检查类型是否非联合类类型

    std::is_class

    template< class T >
    struct is_class;

    (C++11 起)

    检查 T 是否为非联合类类型。若 T 为类类型(但非联合体),则提供等于 true 的成员常量 value 。否则, value 等于 false 。

    注意以 struct 关键词声明的类型是类,故此特性对“结构体”为 true 。

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

    template< class T >
    inline constexpr bool is_class_v = is_class::value;

     可能的实现
    1. namespace detail {
    2. template <class T> char test(int T::*);
    3. struct two { char c[2]; };
    4. template <class T> two test(...);
    5. }
    6. template <class T>
    7. struct is_class : std::integral_constant<bool, sizeof(detail::test<T>(0))==1
    8. && !std::is_union<T>::value> {};

    检查是否为函数类型

    std::is_function

    template< class T >
    struct is_function;

    (C++11 起)

    检查 T 是否为函数类型。如 std::function 、 lambda 、有重载 operator() 的类和指向函数指针不是函数类型。若 T 为函数类型,则提供等于 true 的成员常量 value 。否则, value 等于 false 。

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

    template< class T >
    inline constexpr bool is_function_v = is_function::value;

    (C++17 起)
     可能的实现
    1. // 初等模板
    2. template<class>
    3. struct is_function : std::false_type { };
    4. // 对常规函数的特化
    5. template<class Ret, class... Args>
    6. struct is_function<Ret(Args...)> : std::true_type {};
    7. // 对变参数函数,如 std::printf 的特化
    8. template<class Ret, class... Args>
    9. struct is_function<Ret(Args......)> : std::true_type {};
    10. // 对拥有 cv 限定符的函数类型的特化
    11. template<class Ret, class... Args>
    12. struct is_function<Ret(Args...) const> : std::true_type {};
    13. template<class Ret, class... Args>
    14. struct is_function<Ret(Args...) volatile> : std::true_type {};
    15. template<class Ret, class... Args>
    16. struct is_function<Ret(Args...) const volatile> : std::true_type {};
    17. template<class Ret, class... Args>
    18. struct is_function<Ret(Args......) const> : std::true_type {};
    19. template<class Ret, class... Args>
    20. struct is_function<Ret(Args......) volatile> : std::true_type {};
    21. template<class Ret, class... Args>
    22. struct is_function<Ret(Args......) const volatile> : std::true_type {};
    23. // 对拥有引用限定符的函数类型的特化
    24. template<class Ret, class... Args>
    25. struct is_function<Ret(Args...) &> : std::true_type {};
    26. template<class Ret, class... Args>
    27. struct is_function<Ret(Args...) const &> : std::true_type {};
    28. template<class Ret, class... Args>
    29. struct is_function<Ret(Args...) volatile &> : std::true_type {};
    30. template<class Ret, class... Args>
    31. struct is_function<Ret(Args...) const volatile &> : std::true_type {};
    32. template<class Ret, class... Args>
    33. struct is_function<Ret(Args......) &> : std::true_type {};
    34. template<class Ret, class... Args>
    35. struct is_function<Ret(Args......) const &> : std::true_type {};
    36. template<class Ret, class... Args>
    37. struct is_function<Ret(Args......) volatile &> : std::true_type {};
    38. template<class Ret, class... Args>
    39. struct is_function<Ret(Args......) const volatile &> : std::true_type {};
    40. template<class Ret, class... Args>
    41. struct is_function<Ret(Args...) &&> : std::true_type {};
    42. template<class Ret, class... Args>
    43. struct is_function<Ret(Args...) const &&> : std::true_type {};
    44. template<class Ret, class... Args>
    45. struct is_function<Ret(Args...) volatile &&> : std::true_type {};
    46. template<class Ret, class... Args>
    47. struct is_function<Ret(Args...) const volatile &&> : std::true_type {};
    48. template<class Ret, class... Args>
    49. struct is_function<Ret(Args......) &&> : std::true_type {};
    50. template<class Ret, class... Args>
    51. struct is_function<Ret(Args......) const &&> : std::true_type {};
    52. template<class Ret, class... Args>
    53. struct is_function<Ret(Args......) volatile &&> : std::true_type {};
    54. template<class Ret, class... Args>
    55. struct is_function<Ret(Args......) const volatile &&> : std::true_type {};
    56. // 对所有以上的 noexcept 版本的特化( C++17 及之后)
    57. template<class Ret, class... Args>
    58. struct is_function<Ret(Args...) noexcept> : std::true_type {};
    59. template<class Ret, class... Args>
    60. struct is_function<Ret(Args......) noexcept> : std::true_type {};
    61. template<class Ret, class... Args>
    62. struct is_function<Ret(Args...) const noexcept> : std::true_type {};
    63. template<class Ret, class... Args>
    64. struct is_function<Ret(Args...) volatile noexcept> : std::true_type {};
    65. template<class Ret, class... Args>
    66. struct is_function<Ret(Args...) const volatile noexcept> : std::true_type {};
    67. template<class Ret, class... Args>
    68. struct is_function<Ret(Args......) const noexcept> : std::true_type {};
    69. template<class Ret, class... Args>
    70. struct is_function<Ret(Args......) volatile noexcept> : std::true_type {};
    71. template<class Ret, class... Args>
    72. struct is_function<Ret(Args......) const volatile noexcept> : std::true_type {};
    73. template<class Ret, class... Args>
    74. struct is_function<Ret(Args...) & noexcept> : std::true_type {};
    75. template<class Ret, class... Args>
    76. struct is_function<Ret(Args...) const & noexcept> : std::true_type {};
    77. template<class Ret, class... Args>
    78. struct is_function<Ret(Args...) volatile & noexcept> : std::true_type {};
    79. template<class Ret, class... Args>
    80. struct is_function<Ret(Args...) const volatile & noexcept> : std::true_type {};
    81. template<class Ret, class... Args>
    82. struct is_function<Ret(Args......) & noexcept> : std::true_type {};
    83. template<class Ret, class... Args>
    84. struct is_function<Ret(Args......) const & noexcept> : std::true_type {};
    85. template<class Ret, class... Args>
    86. struct is_function<Ret(Args......) volatile & noexcept> : std::true_type {};
    87. template<class Ret, class... Args>
    88. struct is_function<Ret(Args......) const volatile & noexcept> : std::true_type {};
    89. template<class Ret, class... Args>
    90. struct is_function<Ret(Args...) && noexcept> : std::true_type {};
    91. template<class Ret, class... Args>
    92. struct is_function<Ret(Args...) const && noexcept> : std::true_type {};
    93. template<class Ret, class... Args>
    94. struct is_function<Ret(Args...) volatile && noexcept> : std::true_type {};
    95. template<class Ret, class... Args>
    96. struct is_function<Ret(Args...) const volatile && noexcept> : std::true_type {};
    97. template<class Ret, class... Args>
    98. struct is_function<Ret(Args......) && noexcept> : std::true_type {};
    99. template<class Ret, class... Args>
    100. struct is_function<Ret(Args......) const && noexcept> : std::true_type {};
    101. template<class Ret, class... Args>
    102. struct is_function<Ret(Args......) volatile && noexcept> : std::true_type {};
    103. template<class Ret, class... Args>
    104. struct is_function<Ret(Args......) const volatile && noexcept> : std::true_type {};

    调用示例

    1. #include <iostream>
    2. #include <type_traits>
    3. struct A {};
    4. typedef union
    5. {
    6. int a;
    7. float b;
    8. } B;
    9. struct C
    10. {
    11. B d;
    12. };
    13. enum E {};
    14. enum class Ec : int {};
    15. struct D
    16. {
    17. int fun() const&;
    18. };
    19. template<typename>
    20. struct PM_traits {};
    21. template<class T, class U>
    22. struct PM_traits<U T::*>
    23. {
    24. using member_type = U;
    25. };
    26. int f();
    27. int main()
    28. {
    29. std::cout << std::boolalpha;
    30. std::cout << "std::is_union::value: "
    输出

  • 相关阅读:
    Java代码审计-因酷网校在线教育系统-越权漏洞分析
    java计算机毕业设计课程与成绩管理MyBatis+系统+LW文档+源码+调试部署
    Java注解
    携程开源分布式配置系统Apollo服务端是如何实时更新配置的?
    浅谈One API
    C++ Reference: Standard C++ Library reference: C Library: cctype: isxdigit
    【Java】Vert.x Jackson 序列化后日期数据正常展示
    Django练习
    2.如何创建线程
    矩阵键盘独立接口设计(Keil+Proteus)
  • 原文地址:https://blog.csdn.net/qq_40788199/article/details/134085478