C 標頭檔案系列 system error

2022-07-05 04:51:07 字數 1603 閱讀 4690

報告源於作業系統低層程式介面錯誤。 更進一步說,< system_error >提供了用於報告該方面錯誤的異常機制,是的擴充套件

物以類聚,功能也以「類」分。 剛看到這個標頭檔案的內容,我也有點懵逼,讓我們先理清類與類之間的關係:

雖然這幾個類之間存在非常複雜的轉換構造關係(實際上error_condition也可以通過error_category構造,但為了思路清晰,塗中沒有給出),但我們記住一點----system_error是runtime_error的子類,是異常類。 因此在使用時,我們只要抓住system_error類就行了,構造並丟擲

這裡system_error主要有兩種構造方法:

這樣一來我們的使用思路就很清晰了,都在圖中,具體細節這裡就不贅述了。

這裡有個有趣的東西:

template struct is_error_code_enum : public false_type {}

template struct is_error_condition_enum : public false_type {}

從名字就能推測出,這兩個結構體用來控制其他型別到error_code和error_condition型別的自動轉換。 說到自動轉換,肯定是通過類的conversion constructor進行的。

那麼問題就來了,想要能進行型別轉換,肯定得定義乙個轉換構造器;如果不想,就不能定義。 但這裡只通過顯示特化上面兩個類,就能實現上述行為,這是怎麼做到的呢? 這利用了模板函式對過載決議的影響,也就是sfinae(substitute error is not an error)。

下面舉個例子:

template struct mytype

;template <>

struct mytype;

template ::type>

void func(t t)

int main()

可以看到func模板函式有兩個型別引數,以個為直接引數t,另乙個為推導引數tt(為成員型別mytype< t >::type),這兩個型別引數都需要在例項化時進行替換。 但是實際上我們只為mytype< double >型別定義了成員型別type,所以當函式func進行過載決議時發現mytype< int >型別沒有成員型別type,無法對tt型別進行替換,因此簽名為void func< int >(int t)的函式將會從過載函式集中去掉,結果就是不存在這樣的過載函式, 上面的兩個函式呼叫只有引數為double的能通過編譯。

C 標頭檔案系列 array

注意,該標頭檔案僅在c 11中標準才開始出現。與語言內建的陣列一樣,array類模版支援幾乎所有內建陣列包含的特性 那既然與內建陣列一樣,為什麼還要定義這樣乙個模版呢?c 委員會是想造輪子嗎 當然不是!array模版類實際上是內建陣列的聚合,外加一層封裝。正是由於這層介面,才使得陣列能與stl接軌,...

C 標頭檔案系列 iterator

該標頭檔案圍繞迭代器展開,定義了一系列與迭代器有關的概念,但最最最重要的一點就是 它和其它容器一起實現了c 容器的iterator設計模式。上述文字摘自c 14標準草案,簡而言之,迭代器就是對指標的一層封裝,提供了統一的介面。使用迭代器有很多好處 詳細請見設計模式。迭代器主要有5類 iterator...

C 標頭檔案系列 iterator

該標頭檔案圍繞迭代器展開,定義了一系列與迭代器有關的概念,但最最最重要的一點就是 它和其它容器一起實現了c 容器的iterator設計模式。上述文字摘自c 14標準草案,簡而言之,迭代器就是對指標的一層封裝,提供了統一的介面。使用迭代器有很多好處 詳細請見設計模式。迭代器主要有5類 iterator...