using用于声明命名空间,使用命名空间也可以防止命名冲突,在程序中声明了命名空间后,就可以直接使用命名空间中的定义的类了,在C++11中using的使用更加灵活。
1.定义别名
在C++中定义可以使用typedef,格式如下:
//typedef 旧的类型名 新的类型名
typedef unsigned int uint_t;
使用using和其效果一样,但是格式有点区别,形式如下:
using 新的类型 = 旧的类型
//例子
using uint_t = unsigned int;
2.函数别名
typedef于using使用示例
//typedef方法
typedef int(*func)(int, double);//using方法
using func = int(*)(int, double);
上述使用效果是一样的,但是使用using定义函数指针别名的写法看起来非常直观,把别名强制分离到了左边,而把别名对应的实际类型放在右边,比较清晰,可读性比较好。
3.模板别名
使用typedef有一点限制,就是无法重定义一个模板,比如:
//我们需要定义不同类型的value值得map
typedef map<int, int> m1;
typedef map<int, string> m2;
typedef map<int, double> m3;
//这种情况下我们会不自觉得想到了模板
template <typename T>
typedef map<int, T> Map; //这是错误的//typedef不支持给模板定义别名,如果使用需要套一层外敷类如:
template <typename T>
struct MyMap{typedef map<int, T> Map; //这是错误的
}
通过上述发现上述typedef定义模板别名的时候存在限制。在c++11中,新增了一个特性就是可以通过使用using来为一个模板定义别名,形式如下:
template<typename T>
using Map = map<int, T>;
上述可以见using的可以很方便的给模板指定别名,是的编程变得灵活,看起来更加地简洁。
4.总结
注:using和typedef一样,并不会创建新的类型,他们只是给某个类型定义了新的别名。using相较于typedef的优势在于定义函数指针别名看起来更直观,并且可以给模板定义别名。
----------------------------------------------------
上述如有错误欢迎大家指正。