8

引数のないテンプレート クラスとはどういう意味ですか? たとえば、階乗を計算するテンプレート クラスを考えてみましょう。そのテンプレート引数は N -N!です。

基本的に、これはクラスです:

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

しかし、このクラスには「拡張クラス」があることがわかりました。

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

ここで私の質問は: 引数のないテンプレートとはtemplate<>どういう意味ですか?

前もって感謝します。

4

1 に答える 1

15

これ

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

実際には、テンプレートの完全な特殊化またはクラス template の明示的な特殊Factorial化です。テンプレート部分特化というものもあります。どちらもテンプレートの特殊化の形式です。

テンプレートの特殊化は、テンプレートの特殊化によって示されるパラメーターを使用してテンプレートをインスタンス化するときに、元のテンプレートの代わりにその特定のテンプレートの特殊化が使用される特殊なケースです。

コードでは、元の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つまり、テンプレート パラメーターとして指定するたびに使用される特殊なケースです。

テンプレートの特殊化の注目すべき例の 1 つstd::vector<bool>に がありますが、使用するかどうかに注意する必要があります

また例。そのショーは、クラス テンプレートと関数テンプレートの両方に対するテンプレートの特殊化の最小限の使用を示しています。

于 2013-08-01T03:53:38.640 に答える