c++ - 如何理解C++模板的输出结果

标签 c++ templates

我用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/

相关文章:

C++ 虚拟方法的部分模板特化

c++ - 如何为 boost::program_options 的位置选项添加描述?

c++ - 黑客排名极小极大问题,最大和给出错误的负值

c++ - 模板。添加,获取元素 char*

c++ - 基于类型的标签调度 : Is it possible to differently tag containers based on the tags of their elements?

c++ - 全局函数和非静态成员函数指针设计

c++ - 递归类型的模板特化

c++ - 函数模板作为类模板的参数

c++ - 游戏编程库C++

java - 从 PSD 文件获取动画信息?