繁体   English   中英

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 )我看到它在每个分支中添加了一个唯一的“类型/标签”,就在根Base<type>类之前,但仍然有歧义吗?

先感谢您。

编辑:

图表显示了类型列表中重复类型的多重继承问题。 GSH = GenScatterdHierarchy

在此处输入图片说明

我相信唯一的标签是单独插入的,对于Base<int>的两个连接中的每一个(用蓝线标记)(根目录下的其他基类也是如此)

另外,我插入了图片,让大家更容易理解。 如果它不符合 stackoverflow 的指南,请告诉我,我将删除它。

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创建的类层次结构中:

  1. GenScatterHierarchy<int, Base>A
  2. GenScatterHierarchy<TYPELIST_3(int,string,Widget)>B
  3. GenScatterHierarchy(TYPELIST_4(int,int,string,Widget))C

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM