模板引數的編譯時檢查方法,利用typedef

2021-08-25 01:12:31 字數 505 閱讀 9378

很多情況下,你需要使用模板引數,但又不知道使用者輸入的模板引數是否正確,是否在範圍內等,此時可以利用typedef的特性實現一種模板引數檢查機制。

template< size_t sz = 0 > //模板引數sz預設=0

class templateclass

注:typedef的這個int array顯然沒有實際意義,他的存在僅僅是為了檢查這個模板引數是否符合標準,想上面的情況,他是否小於100,並且是2的power,如果是,則可以順利編譯通過程式,否則,錯誤,所以這其實是利用了編譯器的編譯時檢查來限定引數,可以說是非常的brilliant啊。

其實之所以可以使用這種編譯時檢查機制, 根本在於模板引數是作為常量存在的,所以他可以用在需要常量的場合,此例,完全可以如下:

int testarray[ ( sz <= 100 && ( (sz & sz - 1) == 0 ) ) ? +1 : -1];

或者其他類似的方法,但是是用typedef的話,僅僅是宣告,不會了分配記憶體,這便是他的優越之處。

利用模板在編譯時決定乙個變數的型別

使用模板可以完成很多看起來很不可思議的事情,比如下面這個,可以在編譯時實現靜態型別判斷 include include templateclass typechecker template class typechecker template class typechecker template c...

拔掉網線時Socket的檢查方法

最近在做有關於tcp採集程式時,發現在客戶端與伺服器通過tcp socket進行通訊的時候,如果客戶端應用程式正常或者異常退出時,伺服器都可以在對應的socket通訊連線上獲得響應 如返回0,或者丟擲異常 但是,如果在客戶端的網線被拔掉的情況下,那麼預設情況下,伺服器端需要很長的時間才會知道客戶端的...

呼叫方法時引數的傳遞

呼叫方法時,傳遞給方法的變數如果是基本型別,傳入到方法中後就是該方法的區域性變數,在呼叫時會在記憶體中開闢新的空間去儲存,所以對於引數名與成員變數一致的情況下,方法中改變的變數的值是與成員變數不衝突的,也就是不會影響到成員變數,除非使用this關鍵字來指向成員變數!下面是 示例 public cla...