关于C++中使用using替代typedef

很久没有更新博客了🫠,主要是()学业繁忙,继续写点C++相关吧。

最近在写一些 ds 中的算法时涉及需要同时调试几个函数,操作基本一致,一开始的想法是直接使用函数指针做调用,尽管也顺利完成了,但感觉还是不够C++

之前

先浅谈一下之后可能聊到的东西。

  • 假设共4个函数,分别是 fn1、fn2、fn3、fn4
  • 假令我们的函数指针、typedefusing 定义的均使用fnPtr
  • 函数的参数均为int型,返回值为std::vector<int>

函数指针数组

函数指针可以说是C当中的一个经典写法了,以下定义一个函数指针,怎么读呢?

括号让[]fnPtr先结合表明fnPtr是一个数组,再与*结合表明数组元素是指针,最后与(int )结合表明这是一个函数,而前面的std::vector<int>则表明返回类型。

std::vector<int> (*fnPtr[])(int ) = {fn1 , fn2 , fn3 , fn4}

通过这样一个函数指针,我们可以轻松地像数组一样批量调用fn$i$。

for(int i=0; i<4 ;i++)
    fnPtr[i](i);
// 也可以更C++一点
for(auto & fn:fnPtr)
    fn(1); // 传参 1 是随便写的

使用 typedef

typedef也是很常用了,比如我们不喜欢一直写long long,我们可以使用typedef ,如下:

long long a = 1;
typedef long long ll;
ll b = 1; // good 

在上述例子中,我们可以感觉到typedef好像十分优雅地解决了long long难打的问题,但是如果我们再看下式呢?

typedef std::vector<int> (*fnPtr)(int );

经验丰富的C++大师已经知道这是一个函数指针了,但······作为蒻芨的我还是难以理解。typedef?蒽,看起来在定义一个类型,蒽?定义成谁了?是fnPtr?那为什么long long的例子里面是最后的ll

也许我们应该使用using

使用using

using也可以说是一种typedef的语法糖,但使用using可以使代码可读性变强太多。上例子中long long的问题,使用using的解法如下:

using ll = long long;

我的世界突然就清澈了起来🥰,这个=太符合直觉了,好像就是把long long赋值给ll,所以ll就和long long一样。那函数指针数组呢?

using fnPtr = std::vector<int> (* [])(int );
fnPtr fnptr = {fn1 , fn2 , fn3 , fn4};

看起来是不是比typedef清爽多了,我们好像定义了一个类型fnPtr是一个返回值为std::vector<int> 的函数指针数组,使用这个类型定义一个变量fnptr去存下需要调用的函数岂不妙哉。

for(auto & fn:fnptr)
    fn(1); // 传参 1 是随便写的