[英]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
可以在該行中使用,因為它已在上一行中定義。 有關typedef
和typename
組合使用的說明,請參閱此問題 ,也請閱讀此答案 。
從此鏈接 :
遵循的公式是:
typedef [attributes] DataType AliasName;
typedef
關鍵字是必需的。 該屬性不是。typedef
關鍵字后可以跟隨任何C ++內置數據類型,包括int
,short
,signed
,unsigned
,char
,signed char
,unsigned char
,double
,long
或long 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.