这是一个问题,出于对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 ++设计实践吗?它当然看起来很奇怪,所以我想知道这是否是某种未定义的行为,它恰好依赖于具有许多陷阱和陷阱的编译器,或者它是一个明确定义的模板用法。
看到任何实际的例子都会很有趣。
答案 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...> {};
的不同实例来递归描述。
要明确,template
是make_seq<7>::type
,通过7级递归继承。
答案 1 :(得分:0)
就C ++而言,这是有效的。类模板A<1>
与另一个类模板A<0>
完全不同。
事实上,您在此处构建的内容与所谓的Curiously Recurring Template Pattern类似。