C++ 0x之auto – 从初始化中推断数据类型
2012-11-08 09:35
423 查看
曾几何时,C++ 0x出现在我们眼前,我们还在苦逼的用老的规则写代码,因为我们是码畜,我们的顶头上司要求我们必须用土的掉渣的VS2005来写代码,并且用各种存在很棘手问题的库,还有我们的用户都用的XP,新的库包含一些其他的内容,用户根本都没法用,所以我们依然苦逼着。不过曙光就在眼前了,虽然没看到曙光中的女神,但是先感谢下那帮为C++贡献终生的老头子们。
auto关键字的区分
当年我们学编程的时候记得还有一个auto关键字,是C++ 98标准的,是用来表明具有自动存储期的局部变量,不过这个自动存储期我是木有明白,这个关键字被打入冷宫了。现在那帮old men又重新启用了它,就像武则天和甄嬛一样(我又狗血了,为什么加一个又呢?)。
现在的auto关键字是用来做自动类型推演的,有点类似于类型萃取,不过比类型萃取更简单更好用。
auto详细
我们在用模板或者容器的时候经常都会写一大堆内容来将函数返回值赋值给某个相应的对象,然后用这个对象做一些操作,其实我们根本关心这个对象是什么类型,我们只是因为不那样写编译器不给通过而已,我们都是被逼的。而现在auto就可以帮我们解决这个烦恼,前面说过了,它的特点是自动类型推演,所以都交给它了。
例如,我们有如下的代码:
我们写了这么一坨代码,才实现了一个打印的功能,现在我们可以很简单的写了,连typdef都不用,(我认为typedef大多数时候的作用是为了迭代器,而不容器)。
简单的写法如下:
明显我们的代码量减少了,我们不是按照行数给钱的,所以不用担心代码减少了。
当然了它不仅仅使用在容器上,再看看下面的例子:
auto关键字的好处是解决了长期以来令我们头疼并且给我们带来麻烦的返回值数据类型问题。比如在一些复杂的模板函数里,你可以不用纠结这里到底用什么返回值的数据类型,大大的降低了复杂的数据类型的判断难度和代码量。
所以有高端并且简单的东西为何不用呢,与己方便与人方便嘛
auto关键字的区分
当年我们学编程的时候记得还有一个auto关键字,是C++ 98标准的,是用来表明具有自动存储期的局部变量,不过这个自动存储期我是木有明白,这个关键字被打入冷宫了。现在那帮old men又重新启用了它,就像武则天和甄嬛一样(我又狗血了,为什么加一个又呢?)。
现在的auto关键字是用来做自动类型推演的,有点类似于类型萃取,不过比类型萃取更简单更好用。
auto详细
我们在用模板或者容器的时候经常都会写一大堆内容来将函数返回值赋值给某个相应的对象,然后用这个对象做一些操作,其实我们根本关心这个对象是什么类型,我们只是因为不那样写编译器不给通过而已,我们都是被逼的。而现在auto就可以帮我们解决这个烦恼,前面说过了,它的特点是自动类型推演,所以都交给它了。
例如,我们有如下的代码:
#include <map> #include <iostream> int _tmain(int argc, _TCHAR* argv[]) { typedef std::map<int, int> intMap; typedef intMap::iterator intMapIter; intMap myIntMap; for (intMapIter iter = myIntMap.begin(); iter != myIntMap.end(); ++iter) { std::cout << "First: " << iter->first << " Second: " << iter->second << std::endl; } system("pause"); return 0; }
我们写了这么一坨代码,才实现了一个打印的功能,现在我们可以很简单的写了,连typdef都不用,(我认为typedef大多数时候的作用是为了迭代器,而不容器)。
简单的写法如下:
#include <map> #include <iostream> int _tmain(int argc, _TCHAR* argv[]) { std::map<int, int> myIntMap; for (auto iter = myIntMap.begin(); iter != myIntMap.end(); ++iter) { std::cout << "First: " << iter->first << " Second: " << iter->second << std::endl; } system("pause"); return 0; }
明显我们的代码量减少了,我们不是按照行数给钱的,所以不用担心代码减少了。
当然了它不仅仅使用在容器上,再看看下面的例子:
#include <string> #include <iostream> std::string& GetString(std::string&& myString) { return myString; } int _tmain(int argc, _TCHAR* argv[]) { auto tempString = GetString(std::string("Hello World")); std::cout << tempString << std::endl; system("pause"); return 0; }
auto关键字的好处是解决了长期以来令我们头疼并且给我们带来麻烦的返回值数据类型问题。比如在一些复杂的模板函数里,你可以不用纠结这里到底用什么返回值的数据类型,大大的降低了复杂的数据类型的判断难度和代码量。
所以有高端并且简单的东西为何不用呢,与己方便与人方便嘛
相关文章推荐
- 你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)
- 你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)
- C++11 FAQ中文版:auto – 从初始化中推断数据类型
- Effective Modern C++ 条款6 当auto会推断出不合理的类型时使用显式类型初始化语法
- C++11 FAQ中文版:auto – 从初始化中推断数据类型
- (转载)你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)
- C++中基本数据类型的较特别形式的初始化
- [effective modern c++][2]理解auto类型推断
- (二)C++中的数据类型和初始化方式
- 求变量的数据类型,typeid,bool,C和C++的不同,new和delete,C++中的枚举,inline和可变参数模板,auto和函数模板,宽字符
- C++变量初始化与基本数据类型
- c++数据成员变量初始化顺序问题及特殊成员变量类型初始化
- Effective Modern C++ 条款2 理解auto类型推断
- C++特殊数据类型成员变量的初始化
- C++ 怎么在默认构造函数的初始化列表中初始化指针或者引用类型数据成员
- Effective Modern C++翻译(7)-条款6:当auto推导出意外的类型时,使用显式的类型初始化语义
- [effective modern c++][5]与其使用显示类型推断不如使用auto
- 探索C++0x: 2. 从初始化表达式自动推断类型(auto)
- Effective Modern C++:Item 2 ->弄清auto类型推断
- C++ 12.4.5 类成员的显示初始化----数据成员都是public类型且没有构造函数的类