我觉得,某种角度来看,STL 本身就是靠一堆别名堆砌而成的,
以容器为例,一个容器如 vector<T, alloc> / list<T, alloc>内部有声明::value_type 、::reference 、::iterator 、blabla 等别名,这些主要是方便类型萃取,
比如你写个通用的排序函数,接口就简单点 sort(Container&),表示对整个容器进行排序
那么问题来了,怎么知道各种容器内的类型 T,最简单的萃取是通过 using T = typename Container::value_type 就能知道
(当然你不用任何别名也可以,这个时候就需要自己写一个重载、Traits 类特化偏特化、SFINAE 等操作去支持,自找苦吃)
各种迭代器 iterator 就更不用说了,实现 iterator 也是和容器一样规定了各种别名,并且有专门的萃取类型来辅助处理里面的别名,从而实现在模板的世界里为所欲为
https://en.cppreference.com/w/cpp/iterator/iterator_traits也有一些设计 policy based 过于魔怔了,不得不用别名降低点阅读难度的例子,比如 gcc/hashtable.h,
https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/hashtable.h (当前的版本)从 207 行开始就用了一堆的 using,你要是不用,那还真是整段代码没法看了
如果你说 C++里面别名总是用#define,那我见识短,还没遇到过非用不可的情况