c++11之auto自动类型推断和decltype类型获取
来源:互联网 发布:游族网络大将军 编辑:程序博客网 时间:2024/04/28 13:20
出处 http://blog.csdn.net/srzhz/article/details/7934483
自动类型推断
当编译器能够在一个变量的声明时候就推断出它的类型,那么你就能够用auto关键字来作为他们的类型:
- auto x = 1;
auto x = 1;
编译器当然知道x是integer类型的。所以你就不用int了。接触过泛型编程或者API编程的人大概可以猜出自动类型推断是做什么用的了:帮你省去大量冗长的类型声明语句。
比如下面这个例子:
在原来的C++中,你要想使用vector的迭代器得这么写:
- vector<int> vec;
- vector<int>::iterator itr = vec.iterator();
vector<int> vec;vector<int>::iterator itr = vec.iterator();
看起来就很不爽。现在你可以这么写了:
- vector<int> vec;
- auto itr = vec.iterator();
vector<int> vec;auto itr = vec.iterator();
果断简洁多了吧。假如说自动类型推断只有这样的用法的话那未免也太naive了。在很多情况下它还能提供更深层次的便利。
比如说有这样的代码:
- template <typename BuiltType,typename Builder>
- void
- makeAndProcessObject (const Builder& builder)
- {
- BuiltType val = builder.makeObject();
- // do stuff with val
- }
template <typename BuiltType, typename Builder>voidmakeAndProcessObject (const Builder& builder){ BuiltType val = builder.makeObject(); // do stuff with val}
这个函数的功能是要使用builder的makeObject产生的实例来进行某些操作。但是现在引入了泛型编程。builder的类型不同,那么makeObject返回的类型也不同,那么我们这里就得引入两个泛型。看起来很复杂是吧,所以这里就可以使用自动类型推断来简化操作:
- template <typename Builder>
- void
- makeAndProcessObject (const Builder& builder)
- {
- auto val = builder.makeObject();
- // do stuff with val
- }
template <typename Builder>voidmakeAndProcessObject (const Builder& builder){ auto val = builder.makeObject(); // do stuff with val}
因为在得之builder的类型之后,编译器就已经能知道makeObject的返回值类型了。所以我们能够让编译器自动去推断val的类型。这样一来就省去了一个泛型。
你以为自动类型推断只有这样的用法?那也太naive了。C++11还允许对函数的返回值进行类型推断
新的返回值语法和类型获取(Decltype)语句
- int temp(int a,double b);
int temp(int a, double b);
前面那个int是函数的返回值类型,temp是函数名,int a, double b是参数列表。
现在你可以将函数返回值类型移到到参数列表之后来定义:
- auto temp(int a,double b) ->int;
auto temp(int a, double b) -> int;
后置返回值类型可以有很多用处。比如有下列的类定义:
- class Person
- {
- public:
- enum PersonType { ADULT, CHILD, SENIOR };
- void setPersonType (PersonType person_type);
- PersonType getPersonType ();
- private:
- PersonType _person_type;
- };
class Person{public: enum PersonType { ADULT, CHILD, SENIOR }; void setPersonType (PersonType person_type); PersonType getPersonType ();private: PersonType _person_type;};
那么在定义getPersonType函数的时候我们得这么写:
- Person::PersonType Person::getPersonType ()
- {
- return _person_type;
- }
Person::PersonType Person::getPersonType (){ return _person_type;}
因为函数所在的类Person是声明在函数返回值之后的,所以在写返回值的时候编译器并不知道这个函数是在哪个类里面。由于PersonTYpe是Person类的内部声明的枚举,所以在看到PersonType的时候,编译器是找不到这个类型的。所以你就得在PersonTYpe前面加上Person::,告诉编译器这个类型是属于Person的。这看起来有点麻烦是吧。当你使用新的返回值语法的时候呢就可以这么写:
- auto Person::getPersonType () -> PersonType
- {
- return _person_type;
- }
auto Person::getPersonType () -> PersonType{ return _person_type;}
因为这次编译器看到返回值类型PersonType的时候已经知道这个函数属于类Person。所以它会到Person类中去找到这个枚举类型。
当然上述应用只能说是一个奇技淫巧而已。并没有帮我们多大的忙(代码甚至都没有变短)。所以还得引入C++11的另一个功能。
类型获取(Decltype)
- int x = 3;
- decltype(x) y = x; // same thing as auto y = x;
int x = 3;decltype(x) y = x; // same thing as auto y = x;
上述代码就使用了类型获取功能。和函数返回值后置语法结合起来,可以有如下应用:
- template <typename Builder>
- auto
- makeAndProcessObject (const Builder& builder) -> decltype( builder.makeObject() )
- {
- auto val = builder.makeObject();
- // do stuff with val
- return val;
- }
template <typename Builder>automakeAndProcessObject (const Builder& builder) -> decltype( builder.makeObject() ){ auto val = builder.makeObject(); // do stuff with val return val;}
前面的例子中这个函数的返回值是void,所以不需要为返回值引入泛型。如果返回值是makeObject的返回值的话,那么这个函数就得引入两个泛型。现在又了类型获取功能,我们就能在返回值中自动推断makeObject的类型了。所以decltype确实为我们提供了很大的便利。
- c++11之auto自动类型推断和decltype类型获取
- 自动获取类型的auto和decltype类型说明符
- C++ 11 学习1:类型自动推导 auto和decltype
- C++11新特性:自动类型推断和类型获取
- C++11新特性:自动类型推断和类型获取
- C++11新特性:自动类型推断和类型获取
- C++11新特性:自动类型推断和类型获取
- C++11 自动类型推断和类型获取
- C++11新特性:自动类型推断和类型获取
- C++11新特性:自动类型推断和类型获取
- C++11新特性:自动类型推断和类型获取
- decltype详解之指针类型的推断
- C++11 新特性之自动类型推断和类型获取
- C++11 | 自动类型推断——auto
- C++primer---constexpr、类型别名、auto、decltype
- C++11:"auto"和"decltype"类型说明符的思考
- C++11初探:类型推导,auto和decltype
- 类型别名、auto类型说明符和decltype类型说明符初探
- Assassin’s Creed(hdu4415,贪心)
- C语言中关于时间的操作
- DataSet转换为实体(函数)
- 约瑟夫问题
- Win7系统环境安装配置PHP开发环境
- c++11之auto自动类型推断和decltype类型获取
- MVC和MVP的区别
- hibernate的多条件动态查询(非常实用)
- (一)Win8+XAML+C# 类之间传值
- 半数集问题
- Valid Palindrome
- 你也许不知道的#define用法
- 完美显示html的版权符号
- NYOJ 458题 小光棍数