c++之类型别名的实现

 更新时间:2025年02月19日 08:53:58   作者:_DCG_  
本文主要介绍了c++之类型别名的实现,包括C++98版本使用typedef关键字和C++11版本推荐使用using关键字来创建类型别名,具有一定的参考价值,感兴趣的可以了解一下

类型别名,顾名思义就是为一个类型创建一个新的名称,使用这个新的名称与使用之前的名称一模一样。

c++98版本的类型别名

c++98版本的类型别名方式使用的是typedef关键字,通过typedef关键字实现的类型别名,下面将展示一些c++98版本的类型别名方式。

//基本类型别名
typedef int Integer;  //不要忘记逗号
typedef unsigned int UInt; //不要忘记逗号

//指针类型别名
typedef int* IntPtr;  //不要忘记逗号
typedef char* CharPtr;  //不要忘记逗号

//函数指针别名
typedef void (*FuncPtr)(int, int);  

//复杂类型别名
typedef std::vector<std::string> StringVector;
typedef std::map<std::string, int> StringIntMap; 

现代c++的类型别名方式

在c++11版本引入了using,通过using实现类型别名,详细的示例如下所示:

//基本类型的类型别名
using Integer = int;
using UInt = unsigned int;

//指针类型的类型别名
using IntPtr = int*;
using CharPtr = char*;

//函数指针的类型别名
using FuncPtr = void(*)(int, int);

//复杂类型的类型别名
using StringVector = std::vector<std::string>;
using StringIntMap = std::map<std::string, int>;

为什么引入using?

之所以引入using作为推荐的类型别名方式,是因为using方式相对于typedef有着明显的优势。

  • 更清晰的语法
typedef void(*FuncPtr)(int, int);  //typedef形式
using FuncPtr = void(*)(int, int);  //using形式,更直观
  •  模板别名支持

typedef不支持模板别名,但是using支持模板别名。请看下面的例子:

// 使用using可以创建模板别名
template<typename T>
using Vec = std::vector<T>;

// 使用示例
Vec<int> numbers;        // 等价于 std::vector<int>
Vec<std::string> words;  // 等价于 std::vector<std::string>

// typedef无法直接实现模板别名,需要额外包装
template<typename T>
struct VectorTypedef {
    typedef std::vector<T> type;
};

常见场景

简化复杂类型

很多时候写一些复杂类型的时候,每次创建该类型的变量或者其他使用该类型的场景,都需要写很长的类型名,通过类型别名,我们可以定义一个简短的名字,后续使用到该类型时,使用这个别名即可。请看下面的例子:

//简化stl容器
using StringSet = std::set<std::string>;
using IntMatrix = std::vector<std::vector<int>>;

// 简化智能指针类型
using StringPtr = std::shared_ptr<std::string>;
using IntUPtr = std::unique_ptr<int>;

回调函数类型

using ErrorCallback = std::function<void(const std::string&)>;
using EventHandler = std::function<void(const Event&)>;

在类中使用类型别名

class Container {
public:
    using value_type = int;
    using pointer = value_type*;
    using reference = value_type&;
    
    // STL风格的类型别名
    using iterator = std::vector<value_type>::iterator;
    using const_iterator = std::vector<value_type>::const_iterator;
private:
    std::vector<value_type> data;
};

注意事项

在c++11及以后的c++版本中推荐使用using,不推荐使用typedef.

到此这篇关于c++之类型别名的实现的文章就介绍到这了,更多相关c++ 类型别名内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • C语言中堆空间的生成与释放详解

    C语言中堆空间的生成与释放详解

    以下是对C语言中堆空间的生成与释放进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • 用VC++6.0实现石头剪刀布游戏的程序

    用VC++6.0实现石头剪刀布游戏的程序

    最先看到这个游戏代码是python版的,后来看到有小伙伴用VC++重写了一遍,运行之后发现有些小bug,便尝试这修复了一下,并增加了些小功能,这里分享给大家。
    2015-03-03
  • C语言实现简单酒店管理系统

    C语言实现简单酒店管理系统

    这篇文章主要为大家详细介绍了C语言实现简单酒店管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++对象模型和this指针详解

    C++对象模型和this指针详解

    这篇文章主要介绍了详解C++对象模型和this指针,是C++入门学习中的基础知识,需要的朋友可以参考下,希望能够给你带来帮助
    2021-10-10
  • C++控制结构详情

    C++控制结构详情

    这篇文章主要介绍了C++控制结构详情,C++的控制结构和其它编程语言类似包括顺序结构、选择结构、循环结构,更多相关资料需要的小伙伴可以参考下面文章内容
    2022-03-03
  • VisualStudio2022制作多项目模板及Vsix插件的实现

    VisualStudio2022制作多项目模板及Vsix插件的实现

    本文主要介绍了VisualStudio2022制作多项目模板及Vsix插件的实现,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • 概率的问题:使用递归与多次试验模拟的分析

    概率的问题:使用递归与多次试验模拟的分析

    以下对概率的问题:使用了递归和多次试验模拟。需要的朋友参考下
    2013-05-05
  • C++编程中变量的声明和定义以及预处理命令解析

    C++编程中变量的声明和定义以及预处理命令解析

    这篇文章主要介绍了C++编程中变量的声明和定义以及预处理命令解析,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C或C++报错:ld returned 1 exit status报错的原因及解决方法

    C或C++报错:ld returned 1 exit status报错的原因及解

    这篇文章主要介绍了C或C++报错:ld returned 1 exit status报错的原因及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • C++11显示类型转换的优点

    C++11显示类型转换的优点

    这篇文章主要介绍了C++11显示类型转换的优点,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-08-08

最新评论