LOKI C++:“ScatterHierarchyTag”如何解决继承歧义?
Posted
技术标签:
【中文标题】LOKI C++:“ScatterHierarchyTag”如何解决继承歧义?【英文标题】:LOKI C++: How does 'ScatterHierarchyTag' solve the inheritance ambiguity? 【发布时间】:2019-12-28 09:02:15 【问题描述】:我正在阅读Alexandrescu 的现代 C++ 设计的第 3 章。它解释了 HierarchyGenerators.h 的实现,但是从那时起对库进行了更改。
我无法理解 ScatterHierarchyTag
如何解决解析 Field
函数中的歧义(该函数允许我们访问由特定 Base<type>
定义的成员,例如 Field<int>(Object)
将让我们获得 &Base<int>
到Object
),当用于生成层次结构的类型列表有重复时。 (例如:GenScatterHierarchy<TYPELIST_4(int,int,string,Widget), Base> Object
)我看到它在每个分支中添加了一个唯一的“类型/标签”,就在根 Base<type>
类之前,但仍然存在歧义,对吗?
提前谢谢你。
编辑:
图表显示类型列表中重复类型的多重继承问题。 GSH = GenScatterdHierarchy
我相信,对于到Base<int>
的两个连接中的每一个(用蓝线标记一个),唯一的标签都是单独插入的(根目录下的其他基类也是如此)
另外,为了方便大家理解,我插入了图片。如果它不符合 *** 的指南,请告诉我,我将删除它。
【问题讨论】:
【参考方案1】:ScatterHierarchyTag
没有消除歧义。它的作用是使模棱两可的基类可访问。
考虑以下类层次结构:
class A ;
class B : public A ;
class C : public A, public B ;
C
类包含A
类的两个副本(当 A 不为空时更有意义:),一个是由于直接继承而创建的,另一个是由于通过 B
间接继承而创建的。您可以先访问第二个实例转换为B
:
A &indirect_base = static_cast<B>(C_instance);
对于另一个实例,根本无法访问它。因此,它被称为“不可访问的基地”。
这个例子自然地嵌入到GenScatterHierarchy
创建的类层次结构中:
GenScatterHierarchy<int, Base>
是 A
,
GenScatterHierarchy<TYPELIST_3(int,string,Widget)>
是 B
,
GenScatterHierarchy(TYPELIST_4(int,int,string,Widget))
是 C
。
因此,为类型列表中的第一个 int
创建的 Base<int>
实例是不可访问的基础。但是,如果添加了ScatterHierarchyTag
,我们可以先转换为GenScatterHierarchy<ScatterHierarchyTag<int, TYPELIST_3(int,string,Widget)>, Base>
来访问它。
【讨论】:
"另外一个例子,根本无法访问它。因此,它被称为“不可访问的基础”。"另一个实例意味着C
是从直接继承A
得到的?是否仍然无法通过A &direct_base = C_instance;
@User10482,完全正确。 A &direct_base = C_instance
不起作用,因为它不明确。
非常有趣!谢谢你。我几乎放弃了对这个问题的任何好的答案。 @mizabrik以上是关于LOKI C++:“ScatterHierarchyTag”如何解决继承歧义?的主要内容,如果未能解决你的问题,请参考以下文章
LOKI C++:“ScatterHierarchyTag”如何解决继承歧义?
c++: Loki StrongPtr 对我来说看起来不安全,是这样吗?
在“现代 C++ 设计”/Loki 中发现的小对象分配器是不是已被弃用以支持更新的实现?