__type_traits 编程纪要

 
Type Traits即类型属性。C++类型本身不具有某些我们感兴趣的属性信息,例如(拷贝)构造、析构函数,以及赋值运算符是否Trival,所以我们应当采用某些手段来记录这些信息。这些信息有助于针对某种类型选择最佳的方法。当然我们也可以在类中添加字段来记录这些信息,但这样一来增加了类的负担,二来只能在运行时访问,影响效率。最好的方式当然是在编译时刻就能确定。
 
先给出SGI STL中__type_traits的定义(这是一个模板,可以针对各种类型进行特化):
template <class _Tp>
struct __type_traits {
   typedef __true_type     this_dummy_member_must_be_first;
  typedef __false_type    has_trivial_default_constructor;
   typedef __false_type    has_trivial_copy_constructor;
   typedef __false_type    has_trivial_assignment_operator;
   typedef __false_type    has_trivial_destructor;
   typedef __false_type    is_POD_type;
};
其中:
Struct __true_type{};
Struct __false_type{};
 
下面我们将讲述__type_traits在编程过程中的应用:
假如一个函数Function接受类型为T的参数,针对该参数的类型,我们选择适当的处理方法。
【首要的条件是已经存在__type_traits关于类型T的特化版本,当然也可以用它的缺省版本。】
1.       建立该函数(Function)的两个辅助重载“子函数”(Function_aux),这两个子函数不仅接受原来的T型函数,另外还接受一个参数,分别为__true_type或者__false_type类型的参数。【编译时就是靠这个附加参数来选择恰当的子函数。】
 
2.       获取T类型中我们感兴趣的类型信息。比如:
__type_taits<T>:: has_trivial_copy_constructor, 一般为了简便,我们会做一步typedef,
typedef typename __type_taits<T>:: has_trivial_copy_constructor isTrivalCtor;
这样我们得到一个潜在的、可以为__true_type,也可以为__false_type的类型定义。
 

3. 在Function中调用子函数:
Function_aux( t, isTrivalCtor() )
【注意:最后这个参数带有“()”,这是没办法的办法,C++不能将类型作为变量使用,不像Python那么灵活。】。
最后这个参数是一个__true_type或者__false_type类型的对象。正是因为其类型不同,所以可以在编译时刻即确定应当选用的重载函数。 

在Visual Studio中使用`type_traits`时出现报错,可能有多种原因,以下是一些常见的情况及对应的解决办法: ### 编译器版本不支持 `type_traits`是C++11标准引入的库,如果使用的编译器版本不支持C++11或更高标准,就会报错。 **解决办法**:确保项目使用支持C++11或更高标准的编译器。在Visual Studio中,可以通过以下步骤设置: 1. 右键单击项目,选择“属性”。 2. 在“配置属性” -> “C/C++” -> “语言” -> “C++ 语言标准”中,选择一个支持C++11或更高版本的选项,如“ISO C++17 标准 (/std:c++17)”。 ### 头文件包含问题 如果没有正确包含`type_traits`头文件,编译器将无法找到相关的类型特性。 **解决办法**:在使用`type_traits`的源文件中添加头文件包含语句: ```cpp #include <type_traits> ``` ### 命名空间问题 `type_traits`中的所有内容都位于`std`命名空间中,如果没有正确使用命名空间,也会导致报错。 **解决办法**:使用`std`命名空间,可以通过以下两种方式: - 直接指定命名空间: ```cpp #include <type_traits> int main() { if (std::is_integral<int>::value) { // 代码逻辑 } return 0; } ``` - 使用`using`声明: ```cpp #include <type_traits> using std::is_integral; int main() { if (is_integral<int>::value) { // 代码逻辑 } return 0; } ``` ### 语法使用错误 如果在使用`type_traits`的类型特性时,语法使用错误,也会导致编译报错。 **解决办法**:仔细检查代码中`type_traits`的使用语法,确保正确使用。例如,`is_integral`是一个模板类,需要通过`::value`来获取其布尔值结果。 ### 代码示例 以下是一个简单的使用`type_traits`的示例代码: ```cpp #include <iostream> #include <type_traits> int main() { if (std::is_integral<int>::value) { std::cout << "int is an integral type." << std::endl; } else { std::cout << "int is not an integral type." << std::endl; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值