1

テンプレートを使用する必要があるプログラムを作成しようとしていますが、しばらく立ち往生しています。ここに私のコードの一部があります:

    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;

....

}

したがって、問題は、テンプレートに2番目のパラメーターを指定しない場合、テスト変数に格納されている型のコンパレーターは equal_to である必要があるため、文字列の場合は

equal_to<char>

またはintのベクトルの場合

equal_to<int>

私は長い間それについて考えてきましたが、テンプレートを宣言する方法や、前述の機能を備えた他の方法をまだ理解していません。誰かがこれを解決する方法のヒントや例を教えてくれたらとてもうれしいです.

ありがとう

4

3 に答える 3

4

テンプレート署名で以前のテンプレート パラメーターを使用して、後続のテンプレート パラメーターの既定の引数を形成できます。また、すべての標準コンテナーvalue_typeが含まれる要素の型のエイリアスを定義するという事実を利用できます。

template <typename _Type, 
          typename _Comparator = equal_to<typename _Type::value_type> >
//                                                      ^^^^^^^^^^^^

std::strings には、C++ 標準ライブラリの汎用アルゴリズムで使用できるメンバー関数と型エイリアスも含まれているため、 is の場合にも上記が機能するはず_Typeですstd::string

于 2013-04-12T13:45:20.420 に答える
0

テンプレート定義でこれを試してください:

template <typename _Type, typename _Comparator = equal_to<_Type> >
于 2013-04-12T13:45:44.990 に答える
0

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;
};
于 2013-04-12T13:56:30.820 に答える