2013-12-10 10 views
7

私はこの興味深いスレッドを見ていた: https://stackoverflow.com/a/16596463/2436175テンプレートテンプレートパラメータとコンテナとデフォルトアロケータ:宣言をよりコンパクトにすることはできますか?

私の特定のケースの懸念は、OpenCVのからSTD CVのコンテナ:: Point_のとCV :: Rect_を使用してテンプレート関数を宣言します。 私は反対テンプレートたい:

  • 私はCVの定義を完了するために
  • 基本データ型を使用するのstdコンテナの種類を:: Point_のと品種を:: Rect_

私は終わりました

template <typename T, template <typename, typename> class Container_t> 
    void CreateRects(const Container_t<cv::Point_<T>,std::allocator<cv::Point_<T> > >& points, 
        const T value, 
        Container_t<cv::Rect_<T>,std::allocator<cv::Rect_<T> > >& rects) { 

    } 

これで罰金コンパイル:

次のように宣言してアップ0
void dummy() { 

const std::vector<cv::Point_<double> > points; 
std::vector<cv::Rect_<double> > rects; 
CreateRects(points,5.0,rects); 

} 

(私も、私はまた、例えば、使用することができますCreateRects<double>(points,5,rects)を見てきました)

、例えば私の宣言はよりコンパクトにするどのような方法が存在した場合、私は思っていましたデフォルトのアロケータの2倍を指定する必要はありません。

template <typename T, class C1, class C2> 
void CreateRects(const C1& points, 
       const T value, 
       C2& rects) { 

} 

それは、読みやすいですコンパイルし、タイプが一致していない場合、あなたはコンパイルエラーを取得します:程度のような簡単なコードで何が起こっている

+1

を宣言をコンパクトにする?パフォーマンスの向上はなく、ビルド中に累積された時間が節約され、StackOverflowにポストすることによって無駄になっています。 –

+2

@ThomasMatthewsもし私が何らかの形で可読性を向上させることができれば、後で自分のコードを処理しなければならない人(自分でさえ)に時間を節約するかもしれません。しかし、あなたにはポイントがあります。時には私は面白いと思ったので質問しましたが、必ずしもすぐに役立つとは限りません。 – Antonio

答えて

11

あなたは関数テンプレートにテンプレートテンプレートパラメータContainer_tのテンプレートパラメータの説明を追加することができます。

template 
    < 
     typename T, 
     template 
      < 
       typename U, 
       typename = std::allocator<U> 
      > 
     class Container_t 
    > 
void CreateRects 
    (
     const Container_t<cv::Point_<T> >& points, 
     const T value, 
     Container_t<cv::Rect_<T> >& rects 
    ) 
{ 

} 

それとも、C++ 11の可変引数テンプレートを使用することができます:あなたはしたくないのはなぜ

template 
    < 
     typename T, 
     template <typename...> class Container_t 
    > 
void CreateRects 
    (
     const Container_t<cv::Point_<T>>& points, 
     const T value, 
     Container_t<cv::Rect_<T>>& rects 
    ) 
{ 

} 
+0

良いこと、ありがとう!実際には、私の質問に対する答えが既に私が投稿したリンクにあったことを実感しました。あなたの答えはバリデーショナルテンプレートを画像に追加するので、私はうれしく思っています。 – Antonio

+0

@Antonio 'template クラスContainer_t> void CreateRects(...); 'テンプレート' 、テンプレート>クラスContainer_t> void CreateRects(...); 'しかし、あなたは正しい、同様のソリューションがあなたのリンクにあった。 – Constructor

0

+0

2コンテナには2種類のオブジェクト(Point_ とRect_ )が含まれていますが、これは正しいですか? "テンプレート引数の控除/置換に失敗しました"というエラーが発生しました。 "Container_t '(std :: vector >およびstd :: vector >パラメータの競合する型を推定しました。 ' – Antonio

+0

2つのコンテナを使用していることに気が付かなかった。これを修正する...固定 – egur

+0

うーん...私はうまくいかなかったが、これはうまくいくが、もっとコントロールしたいと思う。 2つのコンテナが同じ種類のもの(両方のベクトルまたは両方のリスト) – Antonio

関連する問題