具有多种类型的递归模板函数
Recursive template function with multiple types
我正试图编写一个函数,计算两个向量的标量乘积。这是代码,它有效。
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:非法使用显式模板参数。这看起来很傻,但我不知道应该做些什么来避免这个错误。
实际上,您不必使用类型——我发现它们非常麻烦,而且它们的语义也不同。你不能部分专门化一个函数,但你可以通过提供默认参数值来重载它们,使它们表现得像专业化:
#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
}
(AFAIK)不支持函数模板的部分专业化,要获得此功能,需要稍微不同一些,比如:
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; }
};
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何在Elixir中调用递归函数并行
- 递归函数有效,但无法记忆
- 为什么我的递归函数按降序打印,然后按升序打印?
- 为什么递归函数的最终输出是 5?
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 如何将记忆应用于此递归函数?
- 如何从递归函数中完全返回,该函数给出了每个函数结果的累积相加?
- 无穷大而循环时具有递归函数
- 即使没有调用这个递归函数,它是如何工作的?
- 如何使此递归函数从给定的起始位置返回最小的整数?
- 此递归函数的每次迭代的值存储在哪里?
- 可以清除递归函数中的变量吗?
- 如何在递归函数调用中返回当前函数值
- 递归函数 c++ 的复杂性
- 这个递归函数有什么作用?运行时的复杂性是多少?
- 任何人都可以查明我的递归函数中的错误吗?
- 递归函数的返回类型推导
- 递归函数调用在后台工作
- 查找存储在二叉搜索树的所有非叶子中的数据总和?(返回整数的独立递归函数