加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何用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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读