標題引自此SO answer。它正在討論使用SFINAE來檢測具有給定簽名的成員函數的存在,並在處理繼承的成員函數時指出接受的答案中的方法失敗。特別是,給出的解釋如下模板實例化不會「繼承」
如果你不是已經明白這個問題,那麼看看頭文件中
std::shared_ptr<T>
的定義就會顯示出來。在那個實現中,std::shared_ptr<T>
是從它繼承的基類派生的operator*() const
。因此,構成「找到」U = std::shared_ptr<T>
的運算符的模板實例化SFINAE<U, &U::operator*>
將不會發生,因爲std::shared_ptr<T>
本身沒有operator*()
,並且模板實例化不會「繼承」。使用「sizeof()技巧」,僅僅檢測T是否具有某些成員函數mf(請參閱此答案和註釋),這一障礙不會影響衆所周知的SFINAE方法。
使用從答案的術語,是用什麼作爲T::mf
模板參數來實例化一個類型VS編譯器來確定它通過一個函數模板參數推導的區別? 「模板實例化不會繼承」是什麼意思?最後,爲什麼不影響檢查是否存在成員,如here?