2017-09-26 101 views
0

比方說,我們有一個模板功能:我們什麼時候需要顯式實例化一個模板函數?

template <class T> T max(T a, T b) { return a > b ? a : b; } 

由於編譯器不執行模板參數推導過程中的任何隱式類型轉換,我們可以通過以下兩種方法調用max(2, 5.5)

  1. 使用鑄造:max(static_cast<float>(2), 5.5f);
  2. 使用顯式模板實例:max<float>(2, 5.5);

第二種情況對我來說很有意義,但是當我們做了明確的模板實例在下面給出(實例而不字符類型調用函數max):

template char max(char a, char b); 

什麼是我們實現退出它?

+1

顯式實例允許提供聲明沒有其他TU定義。 – Jarod42

+0

^- 如果您的模板只能應用於一組有限的類型,這些類型都是事先已知的,這非常有用。 – StoryTeller

回答

1

如果您正在編寫一個庫,那麼不會執行該庫代碼所調用的模板,因此該庫可能會遺漏一些您打算提供的功能。 顯式實例化將強制編譯器爲指定的模板創建實現,即使沒有對它進行調用。

當您最終將您的庫鏈接到客戶端應用程序時,鏈接器將查找您的庫支持的類型的實現。

也許來自以英語爲母語的解釋會更清楚:https://docs.microsoft.com/it-it/cpp/cpp/explicit-instantiation

相關問題