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>

实际上,您在这里构建的内容看起来类似于所谓的奇怪重复模板模式

于 2013-07-10T13:40:00.410 回答