4

これは、C++ の規則に対する好奇心からの質問であり、実際の実際の使用法はありません。テンプレートをいじるときは、次のようなクラス階層を作成しました。

#include <stdio.h>

// Declaration
template <int X = 0>
struct A;

// Specialization for X = 0
template <>
struct A<0>
{
    virtual void foo()
    {
        printf("A<0>::foo()\n");
    }
};

// Extended generalized implementation
template <int X>
struct A : public A<0>
{
    virtual void foo()
    {
        printf("A<1>::foo()\n");
    }

    virtual void bar()
    {
        printf("A<1>::bar()\n");
    }
};

int main()
{
    A<> a0;
    A<1> a1;

    a0.foo();
    a1.foo();
    a1.bar();

    return 0;
}

このコードは、Visual Studio で正常にコンパイルされ、期待される出力を生成します。

A<0>::foo()
A<1>::foo()
A<1>::bar()

これは有効な C++ 設計手法ですか? それは確かに私には奇妙に見えるので、これは、多くの落とし穴や落とし穴のあるコンパイラーに応じてたまたま機能する未定義の動作なのか、それともテンプレートの明確に定義された使用法なのか疑問に思っています。

これの実際の例を見ることは興味深いでしょう。

4

2 に答える 2

3

templateこれは、 を再帰的に定義するときによく使用される標準的な手法です。

このような手法の例は、整数のシーケンスです。

template<int...s> struct seq {typedef seq<s...> type;};

特に、彼らの世代では:

template<int max, int... s> struct make_seq:make_seq<max-1, max-1, s...> {};
template<int... s> struct make_seq<0, s...>:seq<s...> {};

これは、 の別のインスタンス化から継承することにより、再帰的かつ単純に記述されますtemplate

明確に言うmake_seq<7>::typeseq<0,1,2,3,4,5,6>、7 レベルの再帰的継承によるものです。

于 2013-07-10T13:43:51.137 に答える
0

これは、C++ に関する限り有効です。クラス テンプレートA<1>は、別のクラス テンプレートとはまったく異なる動物A<0>です。

実際、ここで作成したものは、 Curiously Recurring Template Patternと呼ばれるものに似ています。

于 2013-07-10T13:40:00.410 に答える