簡體   English   中英

各種類型的默認模板參數

[英]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 ++標准庫的通用算法使用,所以當_Typestd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM