九、 通用工具 ----Type Trait 和 Type Utility

4 Type Trait 和 Type Utility

1 Type Trait

type trait: 提供一种处理type属性的办法;它是一个template,可在编译期间根据一个或多个模板实参产生一个type或value;

  1. 定义与头文件<type_traits>中;

1.1 (单参)类型判断式(TYPE predicate)

所有的类型判断工具:
(1) 用来检验类型性质的Trait
类型按断工具1
类型按断工具2

(2).用来检验class类型的Trait
类型按断工具3

说明:

  1. bool和所有的character类型(char,char16_t,char32_t,wchar_t)都被视为整数类型,std::nullptr_t被视为基础数据类型;
  2. 一个指向“const类型”的非常量pointer或者reference,并不是一个常量,尽管内含常量元素的寻常array是一个常量;

例子:

is_const<int>::value   //false
is_const<int* const> :: value   //true ,不能修改指针的地址
is_const<const int*>:: value //false ,指向常量的指针,可以修改地址

is_const<int[]>::value  //false
is_const<const int[]>::value //true

(3).用以检验类型关系的Trait
类型判断工具4

说明:
1. is_assignable<>的第一个类型若是个nonclass类型,永远会获得false_type,对于class类型,用其寻常类型作为第一个参数可以;

例子:

is_assignable<int,int>::value //false
is_assignable<int&,int>::value //true
is_assignable<int&,void*>::value //false
is_assignable<string,const char*>::value //true

用is_constructible<>:

is_constructible<int>::value //true
is_constructible<int,int>::value  //true
is_constructible<int ,void*>::value //false

(4)。类型修饰符
允许改变类型,前提是该属性未存在,或者移除一个已存在的属性

类型按断工具5

//添加
typedef int T;
add_cosnt<T> ::type //const int 
add_pointer<T>::type //int*

//移除
typeder int* T;
remove_pointer<T>::type  //int 

(5).其他Type Trait
类型按断工具7

2 Reference Wrapeer(引用外覆器)

  1. 声明与<functional>中的class std::reference_wrapper<>
  2. 对于一个给定的类型T,这个类提供了两个函数:

    • ref(): 把T隐式转换为 int&
    • cref() : 把T隐式转换为 const int&
      例子:
template<typename T>
void foo(T val);
//经过调用:
int x;
foo(std::ref(x));
//T变成了int&, 而进过调用:


int x;
foo(std::cref(x));
//T变成了const int&

这个特性被运用与各个地方:

make_pair(): 创建一个pair<> 引用
make_tuple() : 创建一个tuple<>引用
Binder: 用于绑定(bind)引用
Thread: 以by reference形式传递实参

【注意】:reference_wrapper可以使用引用类型作为最高级对象:
例如:

vector<Myclass&> cool;  //error
vector<reference_wrapper<Myclass> > cool; //ok

3 Function Type Wrapper(函数类型外覆器)

  1. <functional>中提供: function<>,提供多态外覆器
  2. 这个class允许将可调用对象(如function,member function, function object和lambda)作为最高级对象;

例子:

void func(int x, int y);
vector<function<void(int ,int)>> task;

task.push_back(func);

task.push_back([](int x, int y ){...});//lambda函数

//调用函数
for(function<void(int,int)> f: task)
{
    f(33,66);
}


//使用member function
class C{
 public:
  void memfunc(int x, in y)const;
};

function<void(const C&,int,int)> mf;
mf = &C::memfunc;
mf(C(),32,22);

【注意:】执行一个函数调用:但是没有目标可以调用,就会抛出std::bad_function_call异常
例子:

function<void(int,int)> f; //空对象

f(33,33);//throw bad_function_call
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值