2

私は「AcceleratedC++」という本を読んでいますが、演習の1つでは、ヘッダーの「equal」関数をエミュレートする必要があります。これまで、次の3つのパラメーターを使用する単純なバージョンを実装しました。

template <class iterType1, class iterType2>
bool cequal(iterType1 begin, iterType1 end, iterType2 e){

    while(begin != end){
        if(!(*begin == *e))
            return false;
        ++begin;
        ++e;
    }
    return true;
}

そして4番目のパラメータを受け入れることができる2番目のバージョン...

template <class iterType1, class iterType2, class boolPred>
bool cequal(iterType1 begin, iterType1 end, iterType2 e, boolPred pred){

    while(begin != end){
        if(!pred(*begin, *e))
            return false;
        ++begin;
        ++e;
    }
    return true;
}

私の質問は、これはそれを行うための理想的な方法ですか?または、これら2つの機能はマージ可能ですか?

4

3 に答える 3

3

最初のバージョンは、最後のパラメーターとしてequal_toオブジェクト を渡して、2 番目のバージョンを呼び出すことができます。または、それをデフォルトのパラメーターとして設定することもできます。私はそれを取り戻します。関数テンプレートにデフォルトの引数を与える方法が実際にはわかりません。c++0x 機能 (decltype) を使用しないと、オーバーロード ソリューションでコードを再利用する方法がわかりません。

template <class iterType1, class iterType2>
bool cequal(iterType1 begin, iterType1 end, iterType2 e){
    return cequal(begin, end, e, std::equal_to<decltype(*begin)>());
}
于 2011-01-19T02:02:15.110 に答える
0

それらをマージしたい場合はoperator==、入力のみを呼び出す最後のパラメーターにデフォルトの述語を提供できます。

編集:例は次のようになります:

template<typename T1, typename T2>
struct eqpred
{
  bool operator(T1 &a, T2 &b) { return a==b; }
}

template <class iterType1, class iterType2, class boolPred=eqpred>
bool cequal(iterType1 begin, iterType1 end, iterType2 e, boolPred pred){

    while(begin != end){
        if(!pred(*begin, *e))
            return false;
        ++begin;
        ++e;
    }
    return true;
}
于 2011-01-19T02:02:19.017 に答える
0

これらの 2 つの関数はマージ可能であるだけでなく、行ごとにほぼ同じです。

拡張してすべてを行うこともできますが、それは少しネタバレになります.

于 2011-01-19T02:02:57.650 に答える