簡體   English   中英

為什么我應該在C ++中使用typedef?

[英]Why should I use typedefs in C++?

讓我們說:

set<int, less<int> > m_intset;

這可行,但現在我將其更改為typedef ,我最終得到兩行代碼:

typedef set<int, less<int> > SetInt;
SetInt m_intset;

這種typedef什么優勢? 我正確使用它嗎?

使用typedef的一些優點:

  1. 簡化 :現在,每次你通常需要set<int, less<int> > ,你只需要輸入SetInt 如果你只使用一次這個集合沒什么大不了的,但是如果你有同一個集合的多個實例,或者需要訪問它的迭代器,那么更短的形式更容易閱讀和輸入。

  2. 澄清set<int, less<int> >不會告訴我關於變量用途的任何信息,只是它是一組int。 使用typedef ,您可以選擇一個解釋該類型用途的標識符,例如InventoryCoordinates

  3. 抽象 :程序改變。 雖然您可能認為現在需要一個set<int, less<int> > ,但是您的需求總是有可能在將來發生變化,需要set<unsigned long, less<unsigned long> >vector<int>或者其他一些變化。 通過使用typedef ,您只需要在一個地方修復它,它將影響程序中SetInt每個實例。 與手動更改源文件中的十幾個或更多條目相比,這更容易並且更不容易出錯。

由於上面的第2點和第3點,當在類或庫中使用時, typedef可以非常強大,因為它可以加強接口和實現之間的分離,這通常被認為是良好的C ++形式。

當然,如果你在同一個程序中多次使用相同的類型,這些優點中的大多數只會真正顯示出來。 如果你只希望使用set<int, less<int> >一次,那么typedef可能有點過分。

Typedef主要是符號方便,但它們確實有很多好處:

  • 聲明函數指針類型(例如,用於回調) - 在完全拼寫時很難完成。
  • 依賴類型信息更容易描述(例如SetInt :: iterator)並且你應該改變主意(假設你去了一個hash_set而不是std :: set),由於typedef而立即有效地更新
  • 它們比內置類型名更好地描述了intent(例如typedef int ErrCode)

我敢肯定還有更多我沒想到......

你有完全正確的。 使用typedef可以更容易地使用SetInt::iterator類的東西。

好處是多次引用相同類型時。 例如,如果要迭代您的集合; 相比:

for (set<int, less<int> >::iterator i = xs.begin(); i != xs.end(); ++i)

有:

for (IntSet::iterator i = xs.begin(); i != xs.end(); ++i)

如果你嵌套模板參數(例如,所不同變得更加明顯setpairvectorstring )。

您正在為要在特定上下文中使用的類型創建別名。 這個例子怎么樣:

typedef int INT32

這一切都很好,如果你只編譯了int是32位數量的環境,你甚至不需要它。 但是,也許在將來的某一天,您將代碼移植到本機int為64位的系統中。 現在你的代碼可能會有一些錯誤,如果它假定int的32位大小在任何地方使用它們。 使用typedef,您只需要更改參數:

typedef /*some 32 bit type*/ INT32 

請注意,這只是一個例子。 如果將來可能發生變化或清除代碼,那么這個想法就會抽象出類型。

暫無
暫無

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

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