2013-12-09 10 views
6

私は2つのベクトルのスカラ積を数える関数を書くことを試みています。 ここにコードがあり、それは動作します。複数の型を持つ再帰的テンプレート関数

template <int N> 
    int scalar_product (std::vector<int>::iterator a, 
         std::vector<int>::iterator b) { 
     return (*a) * (*b) + scalar_product<N - 1>(a + 1, b + 1); 
    } 

    template <> 
    int scalar_product<0>(std::vector<int>::iterator a, 
          std::vector<int>::iterator b) { 
     return 0; 
    } 

しかし、ここでは問題である - 私は、関数のシグネチャは、この

template <typename Iterator ,int N> 
    int scalar_product (Iterator a, Iterator b) { 
     return (*a) * (*b) + scalar_product<N - 1>(a + 1, b + 1); 
    } 

    template <typename Iterator> 
    int scalar_product<0>(Iterator a, 
          Iterator b) { 
     return 0; 
    } 

のようになめらかになりますように、テンプレートの種類と、このイテレータを交換したい。しかし、これは動作しません - 私がコンパイル取得しますエラーC2768:明示的なテンプレート引数の不正使用。愚かなようですが、私はこのエラーを避けるために何を変えるべきかを知ることができませんでした。

+0

この参照:http://stackoverflow.com/questions/3716799/partial-specialization-を – Nim

+0

['std :: inner_product'](http://en.cppreference.com/w/cpp/algorithm/inner_product)を使わないのはなぜですか?ループをインライン展開することはとても重要ですか? – gwiazdorrr

+0

@Nimリンクありがとう - それは助けました。 – htzfun

答えて

4

(私の知る限り)は関数テンプレートの部分特殊化のためのサポートはありません、この機能を得るために、あなたは、少し異なるような何か、それを実行する必要があります。実際に

template <int N> 
struct scalar 
{ 
    template <typename Iterator> 
    static int product(Iterator a, Iterator b) 
    { (*a) * (*b) + scalar<N - 1>::product(a + 1, b + 1); } 
}; 

template <> 
struct scalar<0> 
{ 
    template <typename Iterator> 
    static int product(Iterator a, Iterator b) 
    { return 0; } 
}; 
5

を、あなたが使用する必要はありません型 - 私はそれらがかなり扱いにくく、そのセマンティクスが異なることがわかります。あなたは、部分的に機能を特化することはできませんが、それらをオーバーロードし、それらをデフォルトのパラメータ値を提供することで、専門分野のように動作させることができます。

#include <type_traits> 

template <typename Iterator> 
int scalar_product(Iterator a, Iterator b, std::integral_constant<int, 0> = std::integral_constant<int, 0>() ) 
{ 
    return 0; 
} 

template <int N, typename Iterator> 
int scalar_product (Iterator a, Iterator b, std::integral_constant<int, N> = std::integral_constant<int, N>()) 
{ 
    return (*a) * (*b) + scalar_product(a + 1, b + 1, std::integral_constant<int, N-1>()); 
} 

int foo() 
{ 
    int a[] = { 1, 2, 3, 4 }; 
    int b[] = { 1, 1, 1, 1 }; 
    return scalar_product<4>(a, b); // returns 10 
} 
関連する問題