本文介紹了c++ 模板類;具有任意容器類型的函數,如何定義它?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
限時送ChatGPT賬號..
好的,簡單的模板問題.假設我像這樣定義我的模板類:
template類 foo {上市:foo(T const& first, T const& second) : first(first), second(second) {}模板void bar(C& 容器,T const& baz){//...}私人的:第一;T秒;}
問題是關于我的 bar 函數...我需要它能夠使用某種標準容器,這就是為什么我包含模板/類型名稱 C 部分來定義該容器類型.但顯然這不是正確的方法,因為我的測試班然后抱怨:
錯誤:'bar' 未在此范圍內聲明
那么我將如何以正確的方式實現我的欄功能?也就是說,作為我的模板類的一個函數,具有任意容器類型......我的模板類的其余部分工作正常(具有不會導致錯誤的其他函數),這只是一個有問題的函數.
好的,所以特定函數(bar)是一個 eraseInRange 函數,它擦除指定范圍內的所有元素:
void eraseInRange(C& container, T const& firstElement, T const& secondElement) {...}
一個如何使用它的例子是:
eraseInRange(v, 7, 19);
在這種情況下,v 是一個向量.
編輯 2:傻我!我應該在我的班級之外聲明這個函數,而不是在里面……這是一個非常令人沮喪的錯誤.無論如何,感謝大家的幫助,雖然問題有點不同,但這些信息確實幫助我構建了函數,因為在找到我原來的問題后,我確實遇到了其他一些令人愉快的錯誤.所以謝謝你!
解決方案
特征解決方案.
概括不要超過需要,不要少于.
在某些情況下,該解決方案可能還不夠,因為它會匹配具有此類簽名的任何模板(例如 shared_ptr
),在這種情況下,您可以使用 type_traits
,非常像 duck-typing(模板通常是鴨式的).
#include //Helper 判斷是否有一個用于 T 的 const_iterator.模板結構 has_const_iterator{私人的:模板靜態字符測試(類型名 C::const_iterator*);模板靜態整數測試(...);上市:枚舉 { value = sizeof(test(0)) == sizeof(char) };};//bar() 是為也定義了 const_iterator 的容器定義的//作為 value_type.模板 typename std::enable_if::value,無效>::類型bar(const Container &c, typename Container::value_type const & t){//注意:不需要對 value_type 進行額外檢查,檢查是為了//已經在函數簽名中釋放了.}模板 類DoesNotHaveConstIterator {};#include <向量>int主(){std::vectorC;酒吧 (c, 1.2f);DoesNotHaveConstIterator乙;酒吧 (b, 1.2f);//正確編譯失敗}
一個好的模板通常不會人為地限制它們有效的類型(為什么要?).但是想象一下,在上面的示例中,您需要訪問對象 const_iterator
,然后您可以使用 SFINAE 和 type_traits 將這些約束放在您的函數上.
或者只是像標準庫那樣
概括不要超過需要,不要少于.
template void bar (Iter it, Iter end) {for (; it!=end; ++it) {/*...*
【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!