一:概述
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>
:去掉类型的const
和volatile
限定符。
3. 组合类型特征
std::is_same<T, U>
:判断T
和U
是否相同。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)。