#include <iostream>
// 递归终止模板
template <typename T>
T sum(T value) {
return value;
}
// 可变参数模板
template <typename T, typename... Args>
T sum(T first, Args... rest) {
return first + sum(rest...);
}
可变参数模板展开过程解释
- 定义递归终止模板:
template <typename T> T sum(T value)
定义了递归终止条件。当参数包Args
展开到只剩下最后一个参数时,就会调用这个模板,直接返回这个参数值。
- 定义可变参数模板:
template <typename T, typename... Args> T sum(T first, Args... rest)
是主要的可变参数模板。Args...
是参数包,它可以包含零个或多个参数。
- 在函数体中,
first + sum(rest...)
,首先取出第一个参数first
,然后递归调用sum
函数处理剩余参数包rest
。这个过程会一直重复,直到参数包rest
为空,此时调用递归终止模板。例如,假设有调用sum(1, 2, 3)
,第一次调用sum(1, 2, 3)
,first
为1,rest
为(2, 3)
,执行1 + sum(2, 3)
;接着调用sum(2, 3)
,first
为2,rest
为(3)
,执行2 + sum(3)
;最后调用sum(3)
,返回3,最终结果为1 + (2 + 3) = 6
。