1. 程式人生 > >C++ templates初階

C++ templates初階

C++ templates的最初發展是為了建立“型別安全”的容器如:vector,list和map。但是隨著templates的發展,有人意識到C++ templates機制本身就是一步完整的圖靈機:它可以被用來計算任何可以計算的值,於是匯出了模板超程式設計,創造出了“在C++編譯器內執行並於編譯完成時停止執行”的程式。

一、C++模板

  • 泛型程式設計關於泛型程式設計就是編寫與型別無關的通用程式碼,是程式碼複用的一種手段。而模板是泛型程式設計的基礎。模板又可以分為函式模板和類模板。函式模板代表了一個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。
  • 函式模板
    模板是一個藍圖,它本身並不是函式,是編譯器用使用方式產生特定具體型別函式的模具。所以其實模板就是將本來應該我們做的重複的事情交給了編譯器在編譯器編譯階段,對於模板函式的使用,編譯器需要根據傳入的實參型別來推演生成對應型別的函式以供呼叫。比如:當用double型別使用函式模板時,編譯器通過對實參型別的推演,將T確定為double型別,然後產生一份專門處理double型別程式碼,對於字元型別也是如此。在實現函式模板的例項化時可以分為隱式例項化和顯式例項化。

1.隱式例項化:讓編譯器根據實參推演模板引數的實際型別 2.顯式例項化:在函式名後的<>中指定模板引數的實際型別

   對於函式模板引數的匹配則又可以分為以下幾點:

一個非模板函式可以和一個同名的函式模板同時存在,而且該函式模板還可以被例項化為這個非模板函式 . 對於非模板函式和同名函式模板,如果其他條件都相同,在調動時會優先呼叫非模板函式而不會從該模板產生出一個例項。如果模板可以產生一個具有更好匹配的函式, 那麼將選擇模板 顯式指定一個空的模板實參列表,該語法告訴編譯器只有模板才能來匹配這個呼叫, 而且所有的模板引數都應該根據實參演繹出來 模板函式不允許自動型別轉換,但普通函式可以進行自動型別轉換

  • 類模板類模板中函式放在類外進行定義時,需要加模板引數列表,類模板例項化與函式模板例項化不同,類模板例項化需要在類模板名字後跟<>,然後將例項化的型別放在<>中即可,類模板名字不是真正的類,而例項化的結果才是真正的類。