没有参数的模板类,`template<>`是什么意思?

时间:2013-08-01 03:52:25

标签: c++ templates

没有参数的模板类是什么意思?例如,让我们来一个计算阶乘的模板类,其模板参数在N - N!中。

基本上,这是班级:

template <int N> class Factorial
{
public:
    enum {fact = N * Factorial<N-1>::fact};
};

但是,我发现这个类有一个“扩展类”,

template<> class Factorial<1>
{
public:
    enum {fact = 1};
};

我的问题是:没有参数的模板template<>是什么意思?

提前致谢。

1 个答案:

答案 0 :(得分:13)

template<> class Factorial<1>
{
public:
    enum {fact = 1};
};

实际上是类模板Factorial模板完整专业化显式专业化。还有一些名为模板部分专业化的东西。两者都是template specialization的形式。

模板特化是一种特殊情况,当您使用模板特化指示的参数实例化模板时,将使用该特定模板特化,而不是原始模板。

在您的代码中,原始的Factorial模板类

template <int N> class Factorial
{
public:
    enum {fact = N * Factorial<N-1>::fact};
};
例如,实例化以下内容时使用

  • Factorial<3>
  • Factorial<5>
  • Factorial<42>

但是当你实例化/使用

Factorial<1>

使用模板专精Factorial<1>代替。换句话说,只要您提供1作为模板参数,就会使用这种特殊情况。

模板专业化的一个值得注意的例子是std::vector<bool>you must be careful whether to use it or not

Also an example。该节目对类模板和函数模板的模板特化的使用最少。