2013-12-09 48 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 
}