北冥有鱼 记录生活点滴,分享学习心得

C++11类型推导

auto、decltype和using

Posted by YuChen on November 26, 2017

1. 介绍

C++11标准中,我们不需要指定变量的类型,编译器会自动完成这份工作。这篇短文简要介绍autodecltype的用法。

2. auto和decltype的用法

我们可以将变量声明为auto类型,下面是一下简单数据类型变量的例子:

1
2
3
auto i = 10;
auto ch = 'a';
auto f = 9.2f;

在我们在迭代STL的容器时,需要声明迭代器类型,这在之前是十分冗长的,但是在C++11中,我们可以使用auto进行简化:

1
2
3
4
5
//c++11之前
std::vector<std::string>::iterator i = v.begin();

//c++11
auto i =v.begin();

decltype有着相同的编程模式,但它不是作用在一个变量的类型上。通过使用decltype,我们可以会获得一个表达式结果的类型,接着我们可以将该类型绑定一个名字。

1
2
3
4
5
6
//声明一个字符创列表
vector<string> names;
//为上述列表声明一个迭代器类型
typedef decltype(names.begin()) name_it;
//服用这个声明的类型
name_it another;

3. using的用法

在上面的例子中。我们使用typedefnames.begin()的类型定义类型别名,其实在C++11中,我们还可以使用using来为已知类型定义类型别名,例子如下:

1
2
3
typedef int I;
//上一句等价于下一句
using I = int;

故而,我们可以将typedef decltype (names.begin()) name_it;替换为using name_it = decltype (names.begin());

同样的,我们也可以使用using语句为函数指针定义类型别名,例子如下:

1
2
3
using func = void (*) (int, int);
//上一句等价于下一句
typedef void (*func)(int, int);




更多文章