2013-12-09 55 views
6

我正在嘗試編寫用於計算兩個向量的標量積的函數。 這是代碼,它的工作原理。具有多種類型的遞歸模板函數

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 
}