C++ templates初階
阿新 • • 發佈:2018-12-20
C++ templates的最初發展是為了建立“型別安全”的容器如:vector,list和map。但是隨著templates的發展,有人意識到C++ templates機制本身就是一步完整的圖靈機:它可以被用來計算任何可以計算的值,於是匯出了模板超程式設計,創造出了“在C++編譯器內執行並於編譯完成時停止執行”的程式。
一、C++模板
- 泛型程式設計 關於泛型程式設計就是編寫與型別無關的通用程式碼,是程式碼複用的一種手段。而模板是泛型程式設計的基礎。模板又可以分為函式模板和類模板。函式模板代表了一個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。
- 函式模板
1.隱式例項化:讓編譯器根據實參推演模板引數的實際型別 2.顯式例項化:在函式名後的<>中指定模板引數的實際型別
對於函式模板引數的匹配則又可以分為以下幾點:
一個非模板函式可以和一個同名的函式模板同時存在,而且該函式模板還可以被例項化為這個非模板函式 . 對於非模板函式和同名函式模板,如果其他條件都相同,在調動時會優先呼叫非模板函式而不會從該模板產生出一個例項。如果模板可以產生一個具有更好匹配的函式, 那麼將選擇模板 顯式指定一個空的模板實參列表,該語法告訴編譯器只有模板才能來匹配這個呼叫, 而且所有的模板引數都應該根據實參演繹出來 模板函式不允許自動型別轉換,但普通函式可以進行自動型別轉換
- 類模板
類模板中函式放在類外進行定義時,需要加模板引數列表,類模板例項化與函式模板例項化不同,類模板例項化需要在類模板名字後跟<>,然後將例項化的型別放在<>中即可,類模板名字不是真正的類,而例項化的結果才是真正的類。