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&lt;int, Base&gt;AGenScatterHierarchy&lt;TYPELIST_3(int,string,Widget)&gt;BGenScatterHierarchy(TYPELIST_4(int,int,string,Widget))C

因此,为类型列表中的第一个 int 创建的 Base&lt;int&gt; 实例是不可访问的基础。但是,如果添加了ScatterHierarchyTag,我们可以先转换为GenScatterHierarchy&lt;ScatterHierarchyTag&lt;int, TYPELIST_3(int,string,Widget)&gt;, Base&gt; 来访问它。

【讨论】:

"另外一个例子,根本无法访问它。因此,它被称为“不可访问的基础”。"另一个实例意味着C 是从直接继承A 得到的?是否仍然无法通过A &amp;direct_base = C_instance; @User10482,完全正确。 A &amp;direct_base = C_instance 不起作用,因为它不明确。 非常有趣!谢谢你。我几乎放弃了对这个问题的任何好的答案。 @mizabrik

以上是关于LOKI C++:“ScatterHierarchyTag”如何解决继承歧义?的主要内容,如果未能解决你的问题,请参考以下文章

LOKI C++:“ScatterHierarchyTag”如何解决继承歧义?

c++: Loki StrongPtr 对我来说看起来不安全,是这样吗?

在“现代 C++ 设计”/Loki 中发现的小对象分配器是不是已被弃用以支持更新的实现?

让 Loki Singleton 在 VS 2008 C++ 的 DLL 中工作

如何使用 Loki 的小对象分配器?

如何在 Lua 中成功使用 Loki 的小对象分配器?