类型别名与using

类型别名与using

C++11using 在很多人眼里只是 typedef 的新写法,但它真正的价值在于:写法更直观,尤其是在模板别名场景下比 typedef 好用很多。

1. typedef 的痛点

传统类型别名通常这样写:

1
2
typedef unsigned long ulong;
typedef int (*Func)(int, int);

简单类型还好,一旦遇到函数指针、模板类型,阅读体验会比较差。

2. using 的基本写法

1
2
using ulong = unsigned long;
using Func = int (*)(int, int);

这种形式更像“把右边这个类型命名为左边这个名字”,可读性通常会更好。

3. 函数指针例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;

using Func = int (*)(int, int);

int add(int a, int b)
{
return a + b;
}

int main()
{
Func f = add;
cout << f(1, 2) << endl;
return 0;
}

4. 模板别名是 using 的强项

这一点是 typedef 做不到的。

1
2
3
4
5
6
#include <vector>

template <typename T>
using Vec = std::vector<T>;

Vec<int> nums{1, 2, 3};

如果用 typedef,这里就没法这样直接写模板别名。

5. 常见使用场景

5.1 简化长类型名

1
using StrIntMap = std::map<std::string, int>;

5.2 给函数指针或回调命名

1
using Callback = void (*)(int);

5.3 模板封装

1
2
template <typename T>
using Ptr = std::shared_ptr<T>;

6. using 不只是类型别名

虽然这篇主要讲别名,但 using 在类继承里也有别的用途,比如引入基类成员、继承构造函数等。
不过在日常使用里,最常见的还是“类型别名”这一层。

7. 和 typedef 怎么选?

如果项目已经是现代 C++ 风格,那么新代码里通常更推荐直接用 using

原因很简单:

  • 语义更直观
  • 模板别名支持更好
  • 复杂类型可读性更高

总结

usingC++11 里非常实用的一项语法改进。
简单场景下它只是 typedef 的更清晰替代品,复杂场景下它还能处理模板别名,这一点在现代 C++ 里尤其常用。