[英]Default template argument for various types
我正在嘗試創建一個程序,我必須使用模板,我現在有點困難了。 這是我的代碼的一部分:
template <typename _Type, typename _Comparator = equal_to</*char*/> >
class CSearch {
public:
CSearch();
CSearch(const _Comparator & cmp);
void Add(int id,
const _Type & needle);
set<int> Search(const _Type & hayHeap) const;
private:
struct CSElem {
int id;
_Type sekvence;
};
vector<CSElem> data;
_Comparator comp;
};
template <typename _Type, typename _Comparator>
CSearch<_Type, _Comparator>::CSearch() {
comp = _Comparator();
}
.......
template <typename _Type, typename _Comparator>
void CSearch<_Type, _Comparator>::Add(int id, const _Type& needle) {
CSElem temp;
.....
data.push_back(temp);
}
template <typename _Type, typename _Comparator>
set<int> CSearch<_Type, _Comparator>::Search(const _Type& hayHeap) const {
typename _Type::const_iterator j, t;
...... //trying to find out which items of the variable data are part of hayHeap
if (comp(*t, *j)) {
......
}
......
}
/*
*
*/
int main(int argc, char** argv) {
CSearch <string> test1;
test1 . Add(0, "hello");
test1 . Add(1, "world");
test1 . Search("hello world!");
CSearch <vector<int> > test2;
....
}
所以問題是當我不向模板提供第二個參數時,比較器對於存儲在測試變量中的類型應該是equal_to,所以對於字符串它應該是
equal_to<char>
或者用於向量的向量
equal_to<int>
我已經考慮了很長一段時間,仍然沒有弄清楚如何聲明模板或其他什么,所以它具有前面提到的功能。 如果有人能給我一個提示或如何解決這個問題的例子,我會很高興。
謝謝
您可以使用模板簽名中的先前模板參數來形成后續模板參數的默認參數。 此外,您可以利用以下事實:所有標准容器都為所包含元素的類型定義value_type
別名:
template <typename _Type,
typename _Comparator = equal_to<typename _Type::value_type> >
// ^^^^^^^^^^^^
std::string
s也有成員函數和類型別名,允許它們被C ++標准庫的通用算法使用,所以當_Type
是std::string
時,上面也應該有效。
試試這個模板定義:
template <typename _Type, typename _Comparator = equal_to<_Type> >
您還可以將_ Container
模板模板參數。
template <typename _Type, template <typename> class _Comparator = equal_to >
class CSearch {
public:
typedef typename _Type::value_type elem_type;
CSearch();
CSearch(const _Comparator<elem_type> & cmp);
void Add(int id,
const _Type & needle);
set<int> Search(const _Type & hayHeap) const;
private:
struct CSElem {
int id;
_Type sekvence;
};
vector<CSElem> data;
_Comparator<elem_type> comp;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.