作者:今日屎汰濃 | 来源:互联网 | 2022-12-09 17:37
我遇到过一种情况,我的类模板部分特化分享了很多代码,将它移到基类中是有意义的.但是,对于具有相同基类的所有特化,没有意义.
以下示例代码在GCC 7.1中编译而没有错误:
struct foo_base_1 { void bar() { std::cout <<"base 1" <
struct foo { };
template
struct foo : foo_base_1 { };
template
struct foo : foo_base_2 { };
int main()
{
foo x;
foo y;
x.bar();
y.bar();
}
我意识到,尽管是同一类的专业,但它们实际上是不同的类型.不过,这感觉不对,同样的类可以从不同的基础继承.
我想要的是一些保证,这是可以的.我找不到标准的相关部分,我不愿意相信它只是因为它编译(我以前被咬过).
1> Aconcagua..:
每个模板实例化都是它自己的独立类.就像任何普通的类都可以从你想要的任何基类继承一样,模板实例化也可以这样做.请考虑以下示例:
template
class Derived : public Base
{
};
绝对合法......
例如,这是奇怪的重复模板模式的基础.
如果你现在决定以不同的方式实现特定的实例化(因此你是专门的;或者是部分的,然后是部分的)而不是原始/主模板模式.
该标准似乎有点简短:
17.5.1类模板[temp.class]
1类模板定义无限组相关类型的布局和操作.
2 [示例:单个类模板List可能提供无限的类定义集:每个类型T的一个类List,每个类描述类型T的元素的链接列表.类似地,描述连续动态数组的类模板Array可能定义如下:[some sample template declaration]前缀模板指定声明模板,并且声明中可以使用类型名称T. 换句话说,Array是一个参数化类型,以T为参数. - 结束例子]
[由我强调],但在定义类型特征时稍后使用相同的模式:
23.15.3助手类[meta.help]
[integral_constant的定义]
1类模板integral_constant,别名模板bool_constant及其关联的typedef-names true_type和false_type用作基类,以定义各种类型特征的接口.
随后,该标准使用"具有基本特征"的措辞,如:
23.15.4一元类型特征[meta.unary]
1 本子条款包含可用于在编译时查询类型属性的模板.
2如果相应条件为真,则每个模板都应为UnaryTypeTrait(23.15.1),其基本特征为true_type,否则为false_type.
与之前的引用一起,我们可以得出结论,根据所满足的条件,从任何一个true_type
或false_type
有选择地继承是至少合法的.很难说,如果这一措词甚至强制执行这种继承,或者如果它是合法的,以及定义模板,使得他们只表现一样true_type
,并false_type
没有从明确继承(这是另一回事,但...).
当然,不是权威的,我个人倾向于前面的解释,因为前面的"被用作"(与"可以用作"相反).