2011-01-19 6 views
2

"Accelerated C++"の勉強中ですが、演習の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; 
} 

と第四パラメータを受け入れることができ番目のバージョン...

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つの関数は併合可能ですか?

答えて

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)>()); 
} 
+1

'equal_to 'の問題は、2つのオペランドが同じ型を持つことを期待していますが、その関数には2つの異なる型があります。 – Blindy

+0

@Blindy:彼の関数はイテレータの型が異なりますが、要素の型が同じではないというわけではありません。とにかく2つの異なるタイプを比較したいとは思わないでしょう。そうしようとするとエラーが発生します。私はそれを問題として実際には見ない。それが彼が望むものならば、彼はもちろん異なる機能を使うことができます。 –

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; 
} 
+0

私はそれについて考えましたが、デフォルトのパラメータを==演算子に設定する構文はわかりません – Moin

+0

@Moin、例を使って更新しました。 – Blindy

+0

これは機能しますか?これには、最後の引数として明示的に 'boolPred'を渡す必要があります。また、IIRCでは、関数テンプレートにデフォルトの引数を与えることができません。 – templatetypedef

0

これら2つの関数は単にマージ可能ではありません、彼らはほぼ正確にラインの同じ、ラインです。

私はあなたのためにそれをすべて拡張してやることができますが、それはスポイラーのビットです。

関連する問題