泛型编程基础 C++之auto、decltype

auto
编程时常常需要把表达式的值赋给变量,这就要求在声明变量的时候清楚地知道表达式的类型 。然而要做到这一点并非那么容易,有时甚至根本做不到 。为了解决这个问题,C++11 新标准引入了 auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型 。和原来那些只对应一种特定类型的说明符 (比如 )不同,auto 让编译器通过初始值来推算变量的类型 。
显然,auto定义的变量必须有初始值
auto类型推导例子
auto n = 10;//推导出变量 n 的类型是 intauto f = 12.8;//推导出变量 f 的类型是 doubleauto p = &n;//推导出变量 p 的类型是 int*auto name="xiaoxie";//推导出变量 url 的类型是 const char*,也即一个常量指针
在举一个例子
intx = 0;auto *p1 = &x;//p1 为 int *,auto 推导为 intautop2 = &x;//p2 为 int*,auto 推导为 int*auto &r1= x;//r1 为 int&,auto 推导为 intauto r2 = r1;//r2 为int,auto 推导为 int,auto 会把引用抛弃,直接推导出它的原始类型 。
再举一个例子
intx = 0;constauto n = x;//n 为 const int ,auto 被推导为 intauto f = n;//f 为 const int,auto 被推导为 int(const 属性被抛弃)const auto &r1 = x;//r1 为 const int& 类型,auto 被推导为 intauto &r2 = r1;//r1 为 const int& 类型,auto 被推导为 const int 类型
auto的应用
#include #includeusing namespace std;int main() {vectorvv;for (int i = 0; i < 10; i++)vv.push_back(i);for (vector::iterator it = vv.begin(); it != vv.end(); it++)cout << *it;for (auto it = vv.begin(); it != vv.end(); it++)cout << *it;return 0;}
用于泛型编程
#include using namespace std;class A{public:static int get(void){return 100;}};class B{public:static const char* get(void){return "xiaoxie";}};//用autotemplate void func(void){auto val = T::get();cout << val << endl;}//不用autotemplatevoid func(void){T2 val = T1::get();cout << val << endl;}int main(void){//用autofunc();func();//不用autofuncfunc();funcfunc();return 0;}
和auto功能类似,都是用来在编译时期进行自动类型推导 。
区别:
auto =value;
(exp) =value;
auto是根据等号右边的初始值[value]来推到变量的类型,所以auto要求初始化
是根据括号内表达式[exp]来推到变量的类型,所以不要求初始化
示例
auto i = 1;cout << "type:" << i << "=" << typeid(i).name() << endl;//intdecltype(1.2 + 1) j = 2;cout << "type:" << j << "=" << typeid(j).name() << endl;//double

泛型编程基础  C++之auto、decltype

文章插图
推导规则 1. 如果 exp 是一个不被括号 ( )包围的表达式,或者是一个类成员访问表达式,或者是一个单独的变量,那么 (exp) 的类型就和 exp 一致,这是最普遍最常见的情况 。
2. 如果 exp 是函数调用,那么 (exp) 的类型就和函数返回值的类型一致 。
3. 如果 exp 是一个左值,或者被括号 ( )包围,那么 (exp) 的类型就是 exp 的引用;假设 exp 的类型为 T,那么 (exp) 的类型就是 T& 。
4. 如果上面的条件都不满足,则var的类型与exp的类型相同
下面是一些测试
函数后置返回类型 int func(int x, y);==>auto func(int x, y) -> int;
示例
【泛型编程基础C++之auto、decltype】#includeusing namespace std;template//auto func(T1 x, T2 y)->decltype(x + y)auto func(T1 x,T2 y){decltype(x + y) tmp = x + y;cout