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++  复制消除问题解决示例详析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Qt编写地图实现动态点位标注的示例代码

    Qt编写地图实现动态点位标注的示例代码

    动态点位标注是定制的一个功能模块,提供直接地图上选点设置标记点,点位信息用结构体存储,其中包括了经度、纬度、速度、时间等信息。本文将介绍实现这一功能的示例代码,需要的可以参考一下
    2022-01-01
  • C语言基础之C语言格式化输出函数printf详解

    C语言基础之C语言格式化输出函数printf详解

    这篇文章主要介绍了C语言格式化输出函数printf详解,printf函数中用到的格式字符与printf函数中用到的格式修饰符,感兴趣的小伙伴可以借鉴一下
    2023-03-03
  • c++调用python实现图片ocr识别

    c++调用python实现图片ocr识别

    所谓c++调用python,实际上就是在c++中把整个python当作一个第三方库引入,然后使用特定的接口来调用python的函数或者直接执行python脚本,本文介绍的是调用python实现图片ocr识别,感兴趣的可以了解下
    2023-09-09
  • C++中几种将整数转换成二进制输出的方法总结

    C++中几种将整数转换成二进制输出的方法总结

    下面小编就为大家带来一篇C++中几种将整数转换成二进制输出的方法总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • QT实现多文件拖拽获取路径的方法

    QT实现多文件拖拽获取路径的方法

    这篇文章主要为大家详细介绍了QT实现多文件拖拽获取路径的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 浅析C++中的函数重载

    浅析C++中的函数重载

    这篇文章主要介绍了浅析C++中的函数重载,在C++中,可以为两个或两个以上的函数提供相同的函数名称,只要参数类型不同,或者参数类型相同而参数个数不同,又或者参数类型参数个数相同,参数次序不同,称为函数重载,需要的朋友可以参考下
    2023-08-08
  • C++自带的sort函数如何对vector容器元素进行排序

    C++自带的sort函数如何对vector容器元素进行排序

    这篇文章主要介绍了C++自带的sort函数如何对vector容器元素进行排序问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • C++ Boost命令行解析库的应用详解

    C++ Boost命令行解析库的应用详解

    命令行解析库是一种用于简化处理命令行参数的工具,它可以帮助开发者更方便地解析命令行参数并提供适当的帮助信息,本文主要介绍了不同的命令行解析库和它们在C++项目中的应用,希望对大家有所帮助
    2023-11-11
  • opencv提取水平与垂直线条

    opencv提取水平与垂直线条

    这篇文章主要为大家详细介绍了opencv提取水平与垂直线条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07

最新评论