这是出于对 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++ 设计实践吗?这对我来说当然看起来很奇怪,所以我想知道这是否是某种未定义的行为,它恰好取决于编译器,有很多陷阱和陷阱,或者它是否是模板的定义明确的用法。
看到这方面的任何实际例子会很有趣。
最佳答案
这是定义 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
是seq<0,1,2,3,4,5,6>
通过 7 级递归继承。
关于c++ - 来自不同特化的模板类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17571667/