【C++】C++11特性:模板推导和循环区间
2016-10-02 13:07
483 查看
模板推导
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的项目,一般推荐使用第二种新用法。
相关文章推荐
- cocos2d-x C++ 利用C++11新特性+runAction RepeatForever Sequence DelayTime做一个持续循环函数 每秒更新 5次后停止
- c++特性:指向类成员的指针和非类型类模板参数和函数指针返回值 参数推导机制和关联型别
- [C++模板]Loki中的Length和TypeAt使用C++11特性改进
- C++ 模板类型推导过程中的隐式类型转换
- 数据结构学习系列三-单向循环链表(c++实现且应用模板)
- @C++11 的新特性 对C++技术格局的影响
- 一个实例介绍C++复制控制(有一个C++11新特性要注意)——复制构造函数、赋值操作符、析构函数
- C++开发者都应该使用的10个C++11特性
- C++的重要特性-模板
- 每个C++开发者都应该使用的十个C++11特性
- C++开发者都应该使用的10个C++11特性(转)
- 每个C++开发者都应该使用的十个C++11特性
- C++11新特性:现代C++风格的新元素
- STL学习小记--与C++模板相关的几个特性
- @C++11 的新特性 对C++技术格局的影响
- [C++]C++11新特性
- C#和Java的泛型、C++模板、C#的constraints特性以及弱类型化和强类型化的问题(转)
- [C++] C++11给我们带来的新特性
- [C/C++不常见语法特性]_[模板编译模式]
- C++:30分钟了解C++11新特性