跳到主要内容

特性萃取

在C++中,类型萃取(type_traits)是一种编译时技术,用于在编译期间获取和操作类型的信息。

主要用法

主要用于泛型编程以及在编译时做出决策。

类型萃取可以帮我们检查和处理类型特性,从而优化代码、避免错误或提高性能。 C++11 引入了 <type_traits> 头文件,其中包含许多内置的类型萃取。下面是一些常见的例子:

std::is_integral<T>//判断类型 T 是否为整数类型。
std::is_floating_point<T>//判断类型 T 是否为浮点数类型。
std::is_pointer<T>//判断类型 T 是否为指针类型。
std::is_reference<T>//判断类型 T 是否为引用类型。
std::is_const<T>//判断类型 T 是否为 const 类型。
std::is_same<T, U>//判断类型 T 和 U 是否相同。

简单的是,就是萃取其特性,然后根据相关逻辑判断是否为特定类型,然后给出处理; 例如,一个使用方法是:


#include <type_traits>

template <typename T>
struct is_integral_helper : std::false_type {};

template <>
struct is_integral_helper<bool> : std::true_type {};

template <>
struct is_integral_helper<char> : std::true_type {};

template <>
struct is_integral_helper<short> : std::true_type {};

template <>
struct is_integral_helper<unsigned short> : std::true_type {};

template <>
struct is_integral_helper<int> : std::true_type {};

..... 依次类推各种整形都定义一个特化版本

template <typename T>
struct is_integral : is_integral_helper<typename std::remove_cv<T>::type> {};

萃取的实际应用:

#include <iostream>
#include <type_traits>

template <typename T>
typename std::enable_if<std::is_integral<T>::value, T>::type
foo(T t) {
std::cout << "foo() called with an integral type: " << t << std::endl;
return t;
}

template <typename T>
typename std::enable_if<std::is_floating_point<T>::value, T>::type
foo(T t) {
std::cout << "foo() called with a floating point type: " << t << std::endl;
return t;
}

int main() {
foo(42); // Output: foo() called with an integral type: 42
foo(3.14); // Output: foo() called with a floating point type: 3.14
}