template<typename... ArgTypes>
int add(ArgTypes... args);
template<typename T, typename... ArgTypes>
int add(T t, ArgTypes... args)
{
int sum = 0;
return t + add(args...);
}
template<> int add() {
return 0;
}
如何添加更多的运算,如乘法和减法? template<> int add()
是什么意思?
谁能详细解释这个递归模板是如何工作的?
UPD:谢谢你们关于减法,是的,减法不是可交换的,所以它并不适合这种递归模板。
原文由 Nusrat Nuriyev 发布,翻译遵循 CC BY-SA 4.0 许可协议
它是很常见的递归 可变参数模板。这个想法是我们使用递归
f(x0, x1, ..., xn) = f(f(x0, x1, ..., xn-1), xn) (1)
,在您的样本中
add(x0, x1, ..., xn) = add(x0, x1, ..., xn-1) + xn
。可变参数模板提供了创建这种结构的简单而有用的方法。
首先,定义模板的通用签名(没有实现,因为我们从不使用通用形式)
现在将模板函数专门用于具有至少一个参数的情况。我们使用递归,它提取第一个参数并递归调用自身,参数数量减少一个。
为了停止递归,我们对空模板参数列表使用模板特化(我们在最后一步添加
0
)。For multiplication you need just change
+
by*
, becuse general recursive form (1) is identical in both case, and changereturn 0
toreturn 1
(在最后一步乘以1
)。在减法的情况下,递归 (1) 的一般形式是不可用的,因为
a-b != b-a
会产生歧义。还有除法和其他非交换操作。您必须明确操作顺序。