来自不同专业的模板类继承

时间:2013-07-10 13:17:19

标签: c++ templates inheritance specialization

这是一个问题,出于对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 ++设计实践吗?它当然看起来很奇怪,所以我想知道这是否是某种未定义的行为,它恰好依赖于具有许多陷阱和陷阱的编译器,或者它是一个明确定义的模板用法。

看到任何实际的例子都会很有趣。

2 个答案:

答案 0 :(得分:3)

这是一种在递归定义{{​​1}}时经常使用的标准技术。

这种技术的一个例子是整数序列:

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...> {}; 的不同实例来递归描述。

要明确,templatemake_seq<7>::type,通过7级递归继承。

答案 1 :(得分:0)

就C ++而言,这是有效的。类模板A<1>与另一个类模板A<0>完全不同。

事实上,您在此处构建的内容与所谓的Curiously Recurring Template Pattern类似。