C++ 模板专题 - 类型萃取

一:概述

C++ 中的萃取(或类型萃取)是一种技术,主要用于从类型中提取特定的特性或信息,以便在模板编程中进行更灵活的类型处理。萃取通常通过模板和特化来实现,允许开发者在编译时确定类型的属性。

类型萃取是指通过模板机制,提取和判断类型的一些属性,例如类型是否为指针、引用、数组等,或者提取类型的基础类型、大小等信息。这一机制有助于编写更通用和类型安全的代码. 类型萃取的常见用途:

  • 特性检测:确定一个类型是否满足某种条件(如是否是整型、浮点型等)。
  • 选择性实现:根据提取到的类型特征选择不同的实现或算法。
  • 减少代码重复:通过萃取公共特性,减少代码中的冗余。

二:示例:

cpp 复制代码
#include <iostream>
#include <type_traits>

// 类型萃取
template <typename T>
struct TypeExtractor {
    using BaseType = T;  // 基础类型为 T
    static const bool isPointer = false;  // 默认不是指针
};

template <typename T>
struct TypeExtractor<T*> {
    using BaseType = T;  // 基础类型为 T
    static const bool isPointer = true;  // 是指针类型
};

template <typename T>
void printTypeInfo(T) {
    if (TypeExtractor<T>::isPointer) {
        std::cout << "This is a pointer type." << std::endl;
    } else {
        std::cout << "This is not a pointer type." << std::endl;
    }
    std::cout << "Base type: " << typeid(typename TypeExtractor<T>::BaseType).name() << std::endl;
}

int main() {
    int a = 10;
    int* p = &a;

    printTypeInfo(a);  // Output: This is not a pointer type. Base type: int
    printTypeInfo(p);  // Output: This is a pointer type. Base type: int

    return 0;
}

三:标准库函数:

1. 类型特征

  • std::is_integral<T>:判断 T 是否为整型。
  • std::is_floating_point<T>:判断 T 是否为浮点型。
  • std::is_arithmetic<T>:判断 T 是否为算术类型(整型或浮点型)。
  • std::is_void<T>:判断 T 是否为 void 类型。
  • std::is_pointer<T>:判断 T 是否为指针类型。
  • std::is_reference<T>:判断 T 是否为引用类型。
  • std::is_array<T>:判断 T 是否为数组类型。
  • std::is_class<T>:判断 T 是否为类类型。

2. 类型变换

  • std::remove_pointer<T>:去掉指针的指针类型。
  • std::add_pointer<T>:为类型添加指针。
  • std::remove_reference<T>:去掉引用的类型。
  • std::add_lvalue_reference<T>:为类型添加左值引用。
  • std::add_rvalue_reference<T>:为类型添加右值引用。
  • std::decay<T>:将类型转换为其"最基本"形式(去掉引用和 cv-qualifiers)。
  • std::remove_cv<T>:去掉类型的 constvolatile 限定符。

3. 组合类型特征

  • std::is_same<T, U>:判断 TU 是否相同。
  • std::is_base_of<Base, Derived>:判断 Derived 是否是 Base 的派生类。
  • std::is_constructible<T, Args...>:判断类型 T 是否可以通过给定参数构造。
  • std::is_trivially_constructible<T>:判断类型 T 是否有一个平凡的构造函数。

4. 类型大小和对齐

  • std::alignment_of<T>:返回类型 T 的对齐要求。
  • std::size_of<T>:返回类型 T 的大小(以字节为单位)。

5. 常量表达式和其他

  • std::conditional<B, T, F>:条件类型,若 B 为真则为 T,否则为 F
  • std::enable_if<condition, T>:用于条件启用模板的类型。
  • std::void_t<T>:如果 T 可用,则为 void 类型,用于 SFINAE(Substitution Failure Is Not An Error)。
相关推荐
geovindu3 分钟前
CSharp: Command Pattern
开发语言·后端·c#·.net·.netcore·命令模式·行为模式
今天要早睡_13 分钟前
C++ 核心语法速过:命名空间、引用、函数重载与 nullptr 深度解析
android·java·c++
心易行者21 分钟前
Python自动化测试7步落地法:用python在线运行省掉90%环境配置时间
java·开发语言·人工智能·python·log4j·ai编程
汉克老师1 小时前
CSP-J 初赛(以满分为目标):第二十七课 《图的遍历——BFS广度优先搜索——像“水波纹”一样,一层一层地搜索》
c++·csp-j·小学生·学c++编程
闻缺陷则喜何志丹1 小时前
【动态规划】P3609 [USACO17JAN] Hoof, Paper, Scissor G
c++·算法·动态规划·洛谷
tedcloud1231 小时前
OpenLogi 怎么搭建?用 Rust 打造一个轻量的 Logitech 外设管理工具
linux·运维·服务器·开发语言·后端·rust·开源
汉克老师1 小时前
CSP-J 初赛(以满分为目标):第二十六课 《图的遍历——DFS深度优先搜索——从“树的先序遍历”走进真正的图世界》
c++·csp-j·小学生·学c++编程
Tanjia_kiki1 小时前
谷歌浏览器中F12编辑并重发请求
开发语言·前端·javascript
程序猿编码1 小时前
基于GGML的C++17轻量化语音推理引擎:说话人识别与语音分析技术全解析
开发语言·c++·pytorch·深度学习·神经网络·大模型
影视飓风TIM2 小时前
C++哈希表深度剖析:冲突处理、rehash、迭代器与unordered容器封装
c++·哈希算法·散列表