你搞错了, 这只不过是简单的函数递归而已, 和什么模板元编程一点关系都没有
递归回来的根本原因就是前面的代码只是执行了一部分而已, 后面的没有执行完, 所以还要回去执行后面的代码
rjsp 的代码已经很好的解释了为什么后面会回来, 你只需要跟着他的代码一步一步走或者一步一步调试即可
另外, 以后遇到递归, 手动把代码展开, 不关是用笔还是用键盘, 手动地把代码展开, 像 5 楼一样就能很快理解了
最后, 我帮你把代码改成了模板元编程的写法
程序代码:
#include <iostream>
using std::cout;
using std::endl;
template <typename T, T Value>
struct value_holder {
using type = T;
constexpr static inline auto value {Value};
};
template <bool, typename T, typename>
struct conditional {
using type = T;
};
template <typename T, typename U>
struct conditional<false, T, U> {
using type = U;
};
template <typename T>
struct if_ {
constexpr static inline auto value {T::value > 0};
};
template <typename T>
struct decrease {
using type = value_holder<typename T::type, T::value - 1>;
};
/* 放入正数后, 给出新的数字必定等于 0; 否则, 返回原来的数字 */
template <typename T, template <typename ...> typename Decrease, template <typename...> typename If>
struct count_down {
public:
using type = typename conditional<If<T>::value, count_down<typename Decrease<T>::type, Decrease, If>, T>::type;
constexpr static inline auto value {type::value};
};
int main(int argc, char *argv[]) {
cout << count_down<value_holder<int, 1022 /* 这个正数只要不超过编译器的能力, 可以无限大, 最终结果都是 0 */>, decrease, if_>::value;
}