如何用C模板理解输出结果
发布时间:2020-12-16 10:39:05 所属栏目:百科 来源:网络整理
导读:我用C模板写了偶数/奇数的判断代码. #include iostreamtemplate int N,int Mod2=N%2struct Print { Print() { std::cout N std::endl; }};template int Nstruct PrintN,0 { Print() { std::cout "Even!" std::endl; }};template int Nstruct PrintN,1 { Prin
我用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> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |