簡體   English   中英

C ++中“ typedef”有什么特殊的含義嗎?

[英]Is there any spcecial meaning of “typedef” in C++?

當我閱讀stdc ++代碼時,我對以下幾行感到困惑。 這是來自stl_list.h的一段代碼。

template <class _Tp, class _Alloc>                                      
class _List_base                                                        
  : public _List_alloc_base<_Tp, _Alloc,                                
                            _Alloc_traits<_Tp, _Alloc>::_S_instanceless>
{                                                                       
public:                                                                 
  typedef _List_alloc_base<_Tp, _Alloc,                                 
                           _Alloc_traits<_Tp, _Alloc>::_S_instanceless> 
          _Base;  /* Is _Base a kind of type?*/                              
  typedef typename _Base::allocator_type allocator_type;                

  _List_base(const allocator_type& __a) : _Base(__a) {/* How can a type be initiated like this?*/                  
    _M_node = _M_get_node();                                            
    _M_node->_M_next = _M_node;                                         
    _M_node->_M_prev = _M_node;                                         
  }
}                                                              

令我困惑的是_Base 此名稱由typedef定義。 我認為這是一種類型。 但是_Base出現在初始化列表中。 我如何理解這種用法​​? 或者,請為我粘貼一些有用的鏈接。

它用於基於先前存在的類型定義自定義類型。 要為類型提供別名,您可以說。 typedef可以理解為“定義類型”或“ type從頭”。 def

您可以具有“鏈接”的typdef ,即:

typedef int Id;     // Define new type "Id"
typedef Id UserId;  // Define new type "UserId" based on a previously existing type
// This is possible since "Id" was already defined

然后使用它:

UserId uid = 0; //uid is a variable of type UserId, which is an alias for int

在您每次使用_Base時提供的示例中,都是在_Base使用_List_alloc_base<_Tp, _Alloc, _Alloc_traits<_Tp, _Alloc>::_S_instanceless> ,但使用的方式更短。 使用該別名可以使代碼塊更簡潔,更緊湊。

您可能會注意到該示例在以下行中還使用typedef typename

typedef typename _Base::allocator_type allocator_type;

請注意, _Base可以在該行中使用,因為它已在上一行中定義。 有關typedeftypename組合使用的說明,請參閱此問題 ,也請閱讀此答案


從此鏈接

遵循的公式是:

typedef [attributes] DataType AliasName;

typedef關鍵字是必需的。 屬性不是。 typedef關鍵字后可以跟隨任何C ++內置數據類型,包括intshortsignedunsignedcharsigned charunsigned chardoublelonglong double 數據類型也可以是C ++編譯器附帶的一個庫提供的現有類。 例如,它可以是字符串類。 數據類型也可以是指向已知類型的指針。

即使這是一個定義,您也會在此關鍵字上遇到很多次,但將其視為typedef declaration;可能會更容易typedef declaration; 正如Matteo Italia在下面的評論中指出的那樣。

一個typedef聲明了一個類型的別名-簡寫,如果您願意的話。

它的語法就像您在聲明變量一樣,但是它代替變量而是為指定的類型創建別名:

int a;         // a is a variable of type int
typedef int B; // B is an alias for type int

(請注意,他們經常說typedef original-type alias ,但這是不正確的規則-例如,如果函數指針失敗-這是無緣無故記住的另一條規則)

對於靜態成員,類型別名的作用域范圍內的-在類內部無需其他限定符即可訪問,而在外部則需要限定( _List_base::_Base )。


對於您的特定情況,引用基類只是一個_List_alloc_base<_Tp, _Alloc, _Alloc_traits<_Tp, _Alloc>::_S_instanceless> ,它是_List_alloc_base<_Tp, _Alloc, _Alloc_traits<_Tp, _Alloc>::_S_instanceless> ,每次都完全寫起來肯定很麻煩。

之所以出現在初始化列表中,是因為構造函數正在調用基類的構造函數(即_Base )並傳遞參數__a

如果您可以某種方式“擴大” typedef的范圍並編寫,這可能會更容易看清:

template <class _Tp, class _Alloc>                                      
class _List_base                                                        
  : public _Base
{                                                                       
public:                                                                 
  typedef _List_alloc_base<_Tp, _Alloc,                                 
                           _Alloc_traits<_Tp, _Alloc>::_S_instanceless> 
          _Base;
  typedef typename _Base::allocator_type allocator_type;                

  _List_base(const allocator_type& __a) : _Base(__a) {

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM