c++ - LOKI C++:“ScatterHierarchyTag”如何解决继承歧义?
问题描述
我正在阅读Alexandrescu 的 Modern C++ Design 的第 3 章。它解释了HierarchyGenerators.h的实现,但是从那时起对库进行了更改。
当用于生成层次结构的类型列表有重复时,我无法理解如何ScatterHierarchyTag
解决解析Field
函数中的歧义(该函数允许我们访问由特定定义的成员Base<type>
,例如Field<int>(Object)
让我们获得一个&Base<int>
to )。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 {};
ClassC
包含两个 class 的副本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
。
因此,为类型列表中Base<int>
的第一个创建的实例是一个不可访问的基础。int
但是,如果ScatterHierarchyTag
添加了,我们可以通过转换为GenScatterHierarchy<ScatterHierarchyTag<int, TYPELIST_3(int,string,Widget)>, Base>
first 来访问它。
推荐阅读
- java - 这个输入有什么问题?
- wordpress - 我修改了 php 文件,但我的 WordPress 网站没有更新,为什么?
- python - 如何修复 - Python 中“没有名为‘pandas’的模块”?
- css - CSS中带有currentColor的文本阴影不透明度
- python - python - 如何在 python 数据框中执行以下操作
- python - 如何在 Python 中仅打印列表中不重复的元素?
- discord.py - 如何使用消息类型
- spring-webflux - WebClient 检索 NULL 作为响应正文
- pandas - 在 pandas 的所有组合中找到获胜者(更大的数字)
- active-directory - Gitlab 身份验证返回无效的用户名或密码(缺少 LDAP 窗格)