預設模板參數:為什麼僅限於類別模板?
在 C 中,預設模板參數僅允許用於類別模板。此限制提出了為什麼不能為成員函數模板定義此類參數的問題。
考慮以下範例:
<code class="cpp">struct my_class { template<class T = int> void mymember(T* vec) { // ... } };</code>
在此範例中,嘗試定義預設類型用於成員函數範本內的範本參數 T,但 C 不允許此語法。相反,預設模板參數嚴格限於類別模板。
限制背後的原因
禁止函數模板使用預設模板參數源自於歷史原因。在 C 的早期版本中,獨立函數並未完全整合到該語言的模板系統中。為了鼓勵使用被認為更慣用的成員函數模板,預設模板參數被限制為類別模板。
但是,此限制後來被認為是一種限制,因為它不必要地區分成員函數模板和獨立的功能模板。正如Bjarne Stroustrup 在缺陷報告中指出的那樣:
「禁止函數模板使用預設模板參數是一個錯誤的殘餘......[它]不必要地使獨立函數與成員函數不同,從而嚴重限制了程式設計風格."
C 0x 更新
為了回應這些問題,C 0x 為獨立函數模板引入了預設模板參數。此更改允許模板編程更加靈活和一致。
範例
考慮以下C 0x 程式碼:
<code class="cpp">template<typename Iterator, typename Comp = std::less< typename std::iterator_traits<Iterator>::value_type>> void sort(Iterator beg, Iterator end, Comp c = Comp()) { ... }</code>
在此範例中,為Comp 範本參數指定了一個預設範本實參,允許排序演算法預設使用標準的less 比較函數。
以上是為什麼預設模板參數不能用於 C 中的成員函數模板?的詳細內容。更多資訊請關注PHP中文網其他相關文章!