我用C++模板写了一个偶数/奇数的判断代码。
#include <iostream>
template <int N, int Mod2=N%2>
struct Print {
Print() {
std::cout << N << std::endl;
}
};
template <int N>
struct Print<N, 0> {
Print() {
std::cout << "Even!" << std::endl;
}
};
template <int N>
struct Print<N, 1> {
Print() {
std::cout << "Odd!" << std::endl;
}
};
template <int N>
struct EvenOdd {
EvenOdd() {
EvenOdd<N+1>();
Print<N>();
}
};
template <>
struct EvenOdd<10> {
EvenOdd() {
std::cout << "Hey!" << std::endl;
}
};
int main()
{
EvenOdd<0>();
return 0;
}
这段代码输出:
$ ./a.out
Hey!
Odd!
Even!
Odd!
Even!
Odd!
Even!
Odd!
Even!
Odd!
Even!
我预测过
EvenOdd<10>::EvenOdd() //=> "Hey!"最后被调用。但是,这是错误的。
为什么“嘿!”先输出?
最佳答案
此行为与模板无关。这是基本的递归。您递归实例化 EvenOdd
在 打印之前。因此,第一个打印任何内容的实例是最里面的,即 EvenOdd<10>
.
事情是这样的:第一件事EvenOdd<0>
就是实例化EvenOdd<1>
.只有当它完成时,它才会调用 Print<0>
.直到 EvenOdd<1>
才完成已完成实例化 EvenOdd<2>
并打印,等等:
EvenOdd<0>
EvenOdd<1>
EvenOdd<2>
EvenOdd<3>
EvenOdd<4>
EvenOdd<5>
EvenOdd<6>
EvenOdd<7>
EvenOdd<8>
EvenOdd<9>
EvenOdd<10>
std::cout << "Hey!" << std::endl;
Print<9>
Print<8>
Print<7>
Print<6>
Print<5>
Print<4>
Print<3>
Print<2>
Print<1>
Print<0>
关于c++ - 如何理解C++模板的输出结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1871725/