C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何用C模板理解输出结果大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我用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模板理解输出结果所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。