模板类

时间:2017-11-14 19:23:10

标签: c++ template-meta-programming

有几次我被问过有关静态对象的用法,我想我理解使用它们背后的关键,但是一个让我感到困惑的特殊情况,我知道在代码中他们试图使用递归来制作一个像因子一样的机制打电话,但无法理解代码将经历的不同阶段。

#include<iostream>

using namespace std;

template<short N> class C
{
  private:
     static C<N-1>c;
  public:
     static int const n = N*c.n;
};

template<> class C<0>
{
    public: 
    static int const n =1;
};

int main()
{
    cout<<C<5>::n<<endl;
    return 0;
}

请参阅现场演示here

此代码生成输出120

这到底发生了什么?

1 个答案:

答案 0 :(得分:2)

这条线很不幸

static C<N-1>c;

存在。它稍微混淆了逻辑。

该功能可以像以下一样轻松实现:

template<short N> class C
{
   public:
     static int const n = N*C<N-1>::n;
};

template<> class C<0>
{
  public: 
    static int const n = 1;
};

更容易理解。

净效果相同:

C<5>::n = 5*C<4>::n
C<4>::n = 4*C<3>::n
C<3>::n = 3*C<2>::n
C<2>::n = 2*C<1>::n
C<1>::n = 1*C<0>::n
C<0>::n = 1

现在您可以了解程序如何生成输出。