【C++】C++11特性:模板推导和循环区间

模板推导

C++11在template编程的领域有很大的更新,功能愈发强大了,引入变参模板、外部模板等新功能,大大增强了模板编程的能力,其中新特性Tuple元组使用了变参模板特性。其中用的最多的,是模板推导。对于一些已经明确知道是什么类型的变量,C++11允许我们用auto关键字来自动推导类型,decltype来获取变量类型:

auto i = 10.0;//定义时即可知道是什么类型

decltype(i) b = 2.0;//delctype获取变量的类型

auto func=[](){printf("lambda.\n");};

template<typename LHS, typename RHS>
auto foo2(LHS &lhs, RHS &rhs)->decltype(lhs+rhs)//C++11模板函数返回值推导
{
  return lhs + rhs;
}

在前C++11版本中,函数的返回值是无法推导的。C++11中函数的返回值推导代码中,decltype里面的变量必须是已经定义的变量,函数体内部的变量是不能使用的。一旦函数体很大变量多,返回值推导就不好用。C++14计划直接使用auto关键字来推导模板函数返回值。
下面的代码是错误的:

auto func=[](){printf("lambda.\n");};
decltype(func) func1;//错误,没有构造函数。

template<typename LHS, typename RHS>
auto foo2(LHS &lhs, RHS &rhs)//C++14才会支持

template<typename LHS, typename RHS, typename R>
R foo2(LHS &lhs, RHS &rhs)//不支持函数返回值类型推导

值得注意的是,auto是在程序猿明确知道对象类型的情况下偷懒用的。如果程序猿都没搞清楚具体的类型是什么,那么用auto出bug的几率非常大。

循环区间

在Python中,容器的循环遍历写作:for iter in Vector,其中in是关键字。C++由于用途广泛,像in这样的关键字早已被当做普通变量名用了无数次,因此C++11用如下方式来循环遍历容器:

std::vector<int> a = {1,2,3,4,5};
std::vector<int>::iterator beg = a.begin();
std::vector<int>::iterator end = a.end();
for(; beg != end; ++beg) cout << *beg << " ";//传统用法
cout << endl;

auto iter1 = std::begin(a);
auto iter2 = std::end(a);
for(; iter1 != iter2; ++iter1) cout << *iter1 << " ";//非成员begin和end
cout << endl;

for(auto &iter : a) cout << iter << " ";//C++11循环区间:号相当于Python的in关键字
cout << endl;

int b[5]={6,7,8,9,10};
for(auto &iter : b) cout << iter << " ";//栈数组支持循环区间用法
cout << endl;

int *c = new int[5];
int tmp = 10;
generate(c,c+5,[&](){return ++tmp;});
copy(c,c+5, ostream_iterator<int>(cout, " "));
//for(auto &iter : c) cout << iter << " ";//堆数组不支持auto:循环
cout << endl;

上面展示了一种传统遍历方法和两种C++11循环遍历的新用法。新用法的第一种,iter1和iter2都是迭代器;第二种新用法,iter是直接指向容器元素的引用,不是迭代器。第二种用法代码的运行效率和其他几种用法差别不大,但是更加简洁。如果上了C++11的项目,一般推荐使用第二种新用法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值