C++标准模板(STL)- 类型支持 (类型特性,is_pointer,is_lvalue_reference,is_rvalue_reference)

本文主要是介绍C++标准模板(STL)- 类型支持 (类型特性,is_pointer,is_lvalue_reference,is_rvalue_reference),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

类型特性

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

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

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

类型属性

定义于头文件 <type_traits>

基础类型类别

继承自 std::integral_constant

成员常量

value

[静态]

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

operator bool

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

operator()

(C++14)

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

检查类型是否为指针类型

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<T>::value;

(C++17 起)
可能的实现 
template< class T > struct is_pointer_helper     : std::false_type {};
template< class T > struct is_pointer_helper<T*> : std::true_type {};
template< class T > struct is_pointer :
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<T>::value;

(C++17 起)
可能的实现
template<class T> struct is_lvalue_reference     : std::false_type {};
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<T>::value;

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

调用示例

#include <iostream>
#include <type_traits>class A {};int main()
{std::cout << std::boolalpha;std::cout << "std::is_pointer<A>::value:            "<< std::is_pointer<A>::value << std::endl;std::cout << "std::is_pointer<A *>::value:          "<< std::is_pointer<A *>::value << std::endl;std::cout << "std::is_pointer<A &>::value:          "<< std::is_pointer<A &>::value << std::endl;std::cout << "std::is_pointer<int>::value:          "<< std::is_pointer<int>::value << std::endl;std::cout << "std::is_pointer<int *>::value:        "<< std::is_pointer<int *>::value << std::endl;std::cout << "std::is_pointer<int **>::value:       "<< std::is_pointer<int **>::value << std::endl;std::cout << "std::is_pointer<int[10]>::value:      "<< std::is_pointer<int[10]>::value << std::endl;std::cout << "std::is_pointer<std::nullptr_t>::value:"<< std::is_pointer<std::nullptr_t>::value << std::endl;std::cout << std::endl;std::cout << "std::is_lvalue_reference<A>::value:   "<< std::is_lvalue_reference<A>::value << std::endl;std::cout << "std::is_lvalue_reference<A&>::value:  "<< std::is_lvalue_reference<A&>::value << std::endl;std::cout << "std::is_lvalue_reference<A&&>::value: "<< std::is_lvalue_reference < A&& >::value << std::endl;std::cout << "std::is_lvalue_reference<int>::value: "<< std::is_lvalue_reference<int>::value << std::endl;std::cout << "std::is_lvalue_reference<int&>::value:    "<< std::is_lvalue_reference<int&>::value << std::endl;std::cout << "std::is_lvalue_reference<int&&>::value:   "<< std::is_lvalue_reference < int&& >::value << std::endl;std::cout << std::endl;std::cout << "std::is_rvalue_reference<A>::value:   "<< std::is_rvalue_reference<A>::value << std::endl;std::cout << "std::is_rvalue_reference<A&>::value:  "<< std::is_rvalue_reference<A&>::value << std::endl;std::cout << "std::is_rvalue_reference<A&&>::value: "<< std::is_rvalue_reference < A&& >::value << std::endl;std::cout << "std::is_rvalue_reference<int>::value: "<< std::is_rvalue_reference<int>::value << std::endl;std::cout << "std::is_rvalue_reference<int&>::value:    "<< std::is_rvalue_reference<int&>::value << std::endl;std::cout << "std::is_rvalue_reference<int&&>::value:   "<< std::is_rvalue_reference < int&& >::value << std::endl;std::cout << std::endl;return 0;
}
输出

这篇关于C++标准模板(STL)- 类型支持 (类型特性,is_pointer,is_lvalue_reference,is_rvalue_reference)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/317196

相关文章

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

Rust中的Drop特性之解读自动化资源清理的魔法

《Rust中的Drop特性之解读自动化资源清理的魔法》Rust通过Drop特性实现了自动清理机制,确保资源在对象超出作用域时自动释放,避免了手动管理资源时可能出现的内存泄漏或双重释放问题,智能指针如B... 目录自动清理机制:Rust 的析构函数提前释放资源:std::mem::drop android的妙

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相