LOKI C++:'ScatterHierarchyTag'如何解决继承歧义?
LOKI C++: How does 'ScatterHierarchyTag' solve the inheritance ambiguity?
我正在阅读 Alexandrescu 的现代 C++ 设计的第 3 章。 它解释了 HierarchyGenerators.h 的实现,但是此后对库进行了更改。
我无法理解 ScatterHierarchyTag
如何解决解析 Field
函数时的歧义(该函数允许我们访问由特定 Base<type>
定义的成员,例如 Field<int>(Object)
会得到 &Base<int>
到 Object
),当用于生成层次结构的类型列表有重复项时。 (例如:GenScatterHierarchy<TYPELIST_4(int,int,string,Widget), Base> Object
)我看到它在每个分支中添加了一个唯一的 "type/tag",就在根 Base<type>
class 之前,但是仍然存在歧义吗?
提前致谢。
编辑:
显示类型列表中重复类型的多重继承问题的图表。
GSH = GenScatterdHierarchy
我相信独特的标签是单独插入的,对于到 Base<int>
的两个连接中的每一个(用蓝线标记一个)(对于其他根 classes 也是如此)
另外,为了方便大家理解,我插入了图片。让我知道它是否不符合 Whosebug 的指南,我将删除它。
ScatterHierarchyTag
并没有消除歧义。它的作用是使模棱两可的基础 class 可访问。
考虑以下 class 层次结构:
class A {};
class B : public A {};
class C : public A, public B {};
Class C
包含两份 class A
(当 A 不为空时更有意义:),一个是因为直接继承而创建的,另一个 — 因为通过 B
间接继承。您可以首先访问转换为 B
的第二个实例:
A &indirect_base = static_cast<B>(C_instance);
对于另一个实例,根本无法访问它。因此,它被称为 "inaccessible base".
此示例自然嵌入 class 由 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>
来访问它。
我正在阅读 Alexandrescu 的现代 C++ 设计的第 3 章。 它解释了 HierarchyGenerators.h 的实现,但是此后对库进行了更改。
我无法理解 ScatterHierarchyTag
如何解决解析 Field
函数时的歧义(该函数允许我们访问由特定 Base<type>
定义的成员,例如 Field<int>(Object)
会得到 &Base<int>
到 Object
),当用于生成层次结构的类型列表有重复项时。 (例如:GenScatterHierarchy<TYPELIST_4(int,int,string,Widget), Base> Object
)我看到它在每个分支中添加了一个唯一的 "type/tag",就在根 Base<type>
class 之前,但是仍然存在歧义吗?
提前致谢。
编辑:
显示类型列表中重复类型的多重继承问题的图表。 GSH = GenScatterdHierarchy
我相信独特的标签是单独插入的,对于到 Base<int>
的两个连接中的每一个(用蓝线标记一个)(对于其他根 classes 也是如此)
另外,为了方便大家理解,我插入了图片。让我知道它是否不符合 Whosebug 的指南,我将删除它。
ScatterHierarchyTag
并没有消除歧义。它的作用是使模棱两可的基础 class 可访问。
考虑以下 class 层次结构:
class A {};
class B : public A {};
class C : public A, public B {};
Class C
包含两份 class A
(当 A 不为空时更有意义:),一个是因为直接继承而创建的,另一个 — 因为通过 B
间接继承。您可以首先访问转换为 B
的第二个实例:
A &indirect_base = static_cast<B>(C_instance);
对于另一个实例,根本无法访问它。因此,它被称为 "inaccessible base".
此示例自然嵌入 class 由 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>
来访问它。