c++之類型別名的實現
類型別名,顧名思義就是為一個類型創(chuàng)建一個新的名稱,使用這個新的名稱與使用之前的名稱一模一樣。
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有著明顯的優(yōu)勢。
- 更清晰的語法
typedef void(*FuncPtr)(int, int); //typedef形式 using FuncPtr = void(*)(int, int); //using形式,更直觀
- 模板別名支持
typedef不支持模板別名,但是using支持模板別名。請看下面的例子:
// 使用using可以創(chuàng)建模板別名 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; };
常見場景
簡化復雜類型
很多時候寫一些復雜類型的時候,每次創(chuàng)建該類型的變量或者其他使用該類型的場景,都需要寫很長的類型名,通過類型別名,我們可以定義一個簡短的名字,后續(xù)使用到該類型時,使用這個別名即可。請看下面的例子:
//簡化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++ 類型別名內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!