11.什么是类型萃取-灵析社区

菜鸟码转

类型萃取(type traits)使用模板技术来萃取类型(包含自定义类型和内置类型)的某些特性,用以判断该类型是否含有某些特性,从而在泛型算法中来对该类型进行特殊的处理用来提高效率或者得到其他优化。简单的来说类型萃取即确定变量去除引用修饰以后的真正的变量类型或者 CV 属性。C++ 关于 type traits 的详细使用技巧可以参考头文件 #include <type_traits>。

  • 为什么需要 type traits:

对于普通的变量来说,确定变量的类型比较容易,比如 int a = 10; 可以很容易确定变量的实际类型为 int,但在使用模板时确定变量的类型就比较困难,模板传入的类型为不确定性。为什么需要确定变量的实际类型?因为模板函数针对传入的对不同的类型可能作出不同的处理,这就需要我们在处理函数模板对传入的参数类型和特性进行提取。比如自定义拷贝函数 copy(T *dest, const T *src) ,如果 T 此时为 int 类型,则此时我们只需要 *dest = *src 即可,但是如果我们此时传入的 T 为 char * 字符串类型时,则就不能简单进行指针赋值,所以函数在实际处理时则需要对传入的类型进行甄别,从而针对不同的类型给予不同的处理,这样才能使得函数具有通用性。

  • remove_reference_t 的原理:

move 函数在进行强制类型转换时,会使用到 remove_reference_t,该函数的作用是确定函数除去 C-V 和引用后的类型。以下为 move 的具体实现:

C++

template<typename T>
remove_reference_t<T>&& move(T&& t) {
    return static_cast<remove_reference_t<T>&&>(t);
}

通过 remove_reference_t<T> 可以把 t 对应的类型上的引用给去掉,然后把 t 对应的类型的右值引用符号 && 强制绑定在变量 t 上,这样就强制将变量 t 转换为右值引用类型。remove_reference 函数的原型如下:

C++

/// remove_reference
template<typename _Tp>
struct remove_reference
{ typedef _Tp   type; };

template<typename _Tp>
struct remove_reference<_Tp&>
{ typedef _Tp   type; };

template<typename _Tp>
struct remove_reference < _Tp&& >
{ typedef _Tp   type; };

函数的实现非常简单,去掉绑定在类型中的引用,返回一个 实际类型 type。

  • C++ 类型萃取一般用于模板中,当我们定义一个模板函数后,需要知道模板类型形参并加以运用时就奥数可以用类型萃取。通过确定变量的特征我们可以在模板中使用不同的处理方法。


阅读量:1647

点赞量:0

收藏量:0