一、类型别名
传统的定义类型别名的方法是使用关键字typedef:
typedef int TY_INT;
我们也可以使用#define来定义别名(使用预处理器)
#define TY_INT int
在C++11中使用关键字using来进行别名声明,假设我们现在定义了结构体MyStruct,那么我们可以使用using为Mystruct类型设置一个别名:
using MS=MyStruct;
这样我们在定义该结构体类型变量时,就可以使用MS作为类型名了
MS TempStruct;
相对于typedef,我个人更喜欢using的语法,因为它很像一个赋值表达式,只不过它所‘赋值’的是一个类型。
二、别名模板
前面我们已经看到using定义别名的基本方法,但是显然c++委员会不会因为这点内容就添加一个新的关键字。事实上using还承担着一个更加重要的特性—别名模板。所谓别名模板本质上也是一种模板。定义别名模板的语法和定义类型别名并没有太大的差异,只是多了模板形参列表:
template< template-parameter-list>
uisng identifier = type-id;
其中template-parameter-list是模板的形参列表,而identifier和typ-id是别名类模板型名和原始类模板型名,请看示例:
#include<iostream>
#include <string>
#include <map>
using namespace std;
template<typename T>
using int_map = std::map<int, T>;
int main()
{
int_map<string> int2string;
int2string[1] = "hello";
int2string[2] = " ";
int2string[3] = "world!";
for (auto node :int2string)
{
cout << node.second;
}
cout << endl;
system("pause");
return 0;
}
结果:
在上面的代码中,int_map是一个别名模板,它有一个模板形参。当int_map发生实例化的时候,模板的实参std::string 会替换std::map<int,T>中的T,所以真正的实例化类型是std::map<int,string>.通过这种方式,我们可以在模板形参比较多的时候简化模板形参。