C++:当两个类包含指向另一个类的指针时,如何解决派生类之间的模板循环依赖?

2023-12-08

我有一个父类和一些从它派生的类。我想将两个派生类“配对”,每个派生类都有一个指向另一个派生类的指针。

代码示例:

template<typename DerivedClassName>
class Parent {
    // some stuff
    DerivedClassName* prtToPair;
};

template<typename DerivedClassName>
class DerivedA : public Parent<DerivedClassName> {

};


template<typename DerivedClassName>
class DerivedB : public Parent<DerivedClassName> {

};

// compile fails
DerivedA<DerivedB> dA;
DerivedB<DerivedA> dB;

dA.prtToPair = &dB;
dB.prtToPair = &dA;

我知道我可以使用虚函数来做到这一点,但我尝试找到一种使用模板的方法。

我找到了一个解决方案http://qscribble.blogspot.com/2008/06/circular-template-references-in-c.html:

#include <stdio.h>

template<class Combo> struct A
{
  typedef typename Combo::b_t B;
  B* b;
};

template<class Combo> struct B
{
  typedef typename Combo::a_t A;
  A* a;
};

struct MyCombo {
  typedef A<MyCombo> a_t;
  typedef B<MyCombo> b_t;
};

int main(int argc, char* argv[])
{
  A<MyCombo> a;
  B<MyCombo> b;
  a.b = &b;
  b.a = &a;
  return 0;
}

但它只适用于两个固定的类 A 和 B。考虑到我有很多派生类,并且我想将它们中的任意两个“配对”,我该如何解决这个问题?

更新1.修复第一个代码块中的拼写错误 更新2.我尝试了以下代码

template<typename DerivedClassName>
class Parent {
    // some stuff
public:
    DerivedClassName *prtToPair;
};

template<typename DerivedClassName>
class DerivedA : public Parent<DerivedClassName> {
public:
    void func() {
        std::cout << "A" << std::endl;
    }
};


template<typename DerivedClassName>
class DerivedB : public Parent<DerivedClassName> {
public:
    void func() {
        std::cout << "B" << std::endl;
    }
};

int main() {
    DerivedA<DerivedB<void>> A;
    DerivedB<DerivedA<void>> B;

    A.prtToPair = reinterpret_cast<DerivedB<void> *>(&B);
    B.prtToPair = reinterpret_cast<DerivedA<void> *>(&A);

    A.prtToPair->func();
    B.prtToPair->func();

    return 0;
}

已编译并印刷B A。但这段代码正确吗?它有副作用吗?


像下面这样的东西吗?

#include <type_traits>

template <typename Combo>
struct Parent {
  // some stuff
  typename Combo::other_type* prtToPair;
};

template <typename Combo>
class DerivedA : public Parent<Combo> {};

template <typename Combo>
class DerivedB : public Parent<Combo> {};

template <template <typename...> class T, template <typename...> class U>
struct Combo {
 private:
  template <typename Combo, bool B>
  struct impl {
    using other_type =
        typename std::conditional_t<B, typename Combo::type2, typename Combo::type1>;
  };

 public:
  using type1 = T<impl<Combo, true>>;
  using type2 = U<impl<Combo, false>>;
};

int main() {
  using C = Combo<DerivedA, DerivedB>;
  using A = typename C::type1;
  using B = typename C::type2;

  A dA;
  B dB;

  dA.prtToPair = &dB;
  dB.prtToPair = &dA;
}

它使得这两种类型依赖于Combo它们与正确的相关联并选择other_type是实施的一部分Combo。注意Combo<DerivedA, DerivedB> and Combo<DerivedB, DerivedA>不过现在会导致不同的类型。


关于您的编辑:

通过返回的指针访问值reinterpret_cast到不相关的类型或使用它调用非静态成员函数(正如您所做的那样)会导致未定义的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++:当两个类包含指向另一个类的指针时,如何解决派生类之间的模板循环依赖? 的相关文章

  • 实体框架 - sql server 表中未设置默认值

    SQL Server 2005 数据库表有一列 createdon 其默认值设置为 getdate 我正在尝试使用实体框架添加记录 createdon 列未更新 我是否错过了实体框架中的任何属性 请提出建议 这是实体框架存在的少数问题之一
  • 如何在自定义保存操作 WFFM 中获取 Sitecore.Current.Site 对象?

    我在用着面向营销人员的 Sitecore 网络表单 在里面save action我得到的表格Sitecore Context Site对象 但该对象没有返回正确的上下文 该值为 modules shell 有谁知道我如何才能获得正确的上下文
  • NHibernate手动控制抓取

    我正在使用 NHibernate 我想控制手动获取相关实体 这是我的示例实体 public class Post public virtual long Id get set public virtual string Title get
  • 任务计划程序控制台输出在哪里? (C# 控制台应用程序)

    我正在运行 C Windows 控制台应用程序 并通过任务计划程序传递几个参数 它全天运行 将其他应用程序创建的平面文件数据加载到 SQL Server 中 该程序间歇性失败 并且我有 Try Catch 逻辑 该逻辑使用 Console
  • 递归显式模板实例化以导出库的符号

    在我之前的问题中我问过递归显式模板实例化是否可能 https stackoverflow com questions 7395113 is recursive explicit template instantiation possible
  • 在 IEnumerable 中查找相同的集合

    有一项任务要弄清楚如何更新表 DataTable 连接到一个database没有UPDATE陈述 我想出的例子是从邮箱中读取警报 该表将写入 Alerts 如果邮件正文包含单词 SUCCESS gt Alert 变为绿色 如果 FAIL g
  • 在 std::forward 中它如何接受右值?

    看看斯科特 迈耶的有效的现代 C 第200 201页 建议的简化实施std forward可能是 在其他地方看到了正确的实现 template
  • 管理多个解决方案中存在的 C# 项目的 Nuget 包

    我现在正处于这样的阶段重构疯狂一个有很多的大项目遗留和不稳定的模块 我决定拆分解决方案目前 所有项目 大约有 20 个 而且由于下个月肯定会出现单元测试项目 还会有更多 链接在一起 使其更加独立和细化 通过这种方法 有一些模块 例如需要在多
  • iPhone 编程游戏

    使用 Objective C 还是 C 为 iPhone 编写游戏最好 像 Flight Control 这样的游戏会用什么语言编写 图形应采用什么格式才能在 iPhone 上正确显示并快速加载 像 Flight Control 这样的游戏
  • 在 .NET Core 上通过 MEF 将参数传递给插件构造函数?

    我花了几个小时试图弄清楚如何通过 MEF System Composition 将参数传递给插件构造函数 但一切都无济于事 不用说 相关文档很少 查看源代码也没有帮助 这曾经非常容易做到 使用 CompositionHost Compose
  • 为什么泛型 IList<> 不继承非泛型 IList

    IList
  • 等效

    这是否保证始终为真 std numeric limits
  • 对嵌套属性使用 XmlAttributeOverrides

    我试图使用 XmlAttributeOverrides 来控制类序列化后哪些类属性出现在 xml 中 它适用于 根 类上的属性 但不适用于嵌套属性 这是一个简单的例子来说明我想要完成的任务 我的类层次结构如下 public class Ma
  • 从资源文件获取 DisplayName [重复]

    这个问题在这里已经有答案了 我在 App GlobalResources 文件夹中有特定于文化的资源文件 现在我需要从此资源文件中读取 DisplayName 属性的值 我在用 Display Name MerchantName Resou
  • 为什么 istream/ostream 慢

    于 50 40http channel9 msdn com Events GoingNative 2013 Writing Quick Code in Cpp Quickly http channel9 msdn com Events Go
  • 实例着色器矩阵的设置

    我想绘制实例立方体 我可以打电话GL DrawArraysInstanced PrimitiveType Triangles 0 36 2 成功地 我的问题是所有立方体都绘制在相同的位置和相同的旋转 我如何为每个立方体单独更改它 要创建不同
  • 所有区域的启用保护模式必须设置为相同的值(启用或禁用)

    我正在尝试使用Selenium Internet Explorer驱动程序 但当我尝试实例化它时它崩溃了 TestInitialize public void TestInitialise ieDriver new InternetExpl
  • 将整个单词与特殊字符匹配的正则表达式不起作用? [复制]

    这个问题在这里已经有答案了 我正在经历这个问题C Regex Match 整个单词 https stackoverflow com q 1209049 443568 它说要匹配整个单词使用 b模式 b 这对于匹配没有任何特殊字符的整个单词效
  • 在 C++11 中设置 std::thread 优先级的可移植方法

    在后 C 11 世界中设置 std thread 实例的优先级的正确方法是什么 是否有一种至少在 Windows 和 POSIX Linux 环境中有效的可移植方法 或者是获取句柄并使用可用于特定操作系统的任何本机调用的问题 无法通过 C
  • 文件按文件名模式存在

    我在用 File Exists filepath 我想做的是将其替换为模式 因为文件名的第一部分发生了变化 例如 该文件可以是 01 peach xml 02 peach xml 03 peach xml 如何根据某种搜索模式检查文件是否存

随机推荐

  • Couchbase 连接 - 外部 IP 而不是内部 IP

    在同一个数据中心 我有一个应用程序服务器 客户端 连接到包含 3 个节点的 couchbase 集群 我希望客户端通过内部 IP 而不是外部 IP 进行连接 以优化性能 假设这些是我的 IP 节点1内部IP 节点1外部IP 节点2内部IP
  • CLGeocoder 从给定位置反向地理编码

    给定经度和纬度不是我当前的位置如何使用执行反向地理编码查找GLGeocoder self geoCoder CLGeocoder alloc init self locationManager CLLocationManager alloc
  • JSF 2:直接调用托管 bean

    我是 JSF 新手 2 在 Struts 中 我们可以从 URL 调用一个操作 例如app action 这会调用一个操作并返回一个结果页面 例如 JSP 最初没有 JSP HTML 如何在 JSF 中完成同样的事情 我知道如何从 xhtm
  • FOSRestBundle 和 JMSSerializer 自定义表单错误处理程序

    我已经为 JMSSerializerBundle 编写了一个自定义表单处理程序 我将其与 FOSRestBundle 一起使用 根据文档它应该像正确标记服务一样简单 但我的自定义处理程序永远不会被使用 这是处理程序
  • 当子报告溢出到新页面时,我想要“继续...”文本

    我认为 这应该是一个功能 当子报表详细信息带溢出到下一页时 应该出现 继续 或其他内容 但我无法解决该问题 我试图找出答案 如果有任何解决方案 但没有任何作用 任何人都可以有更好的想法 如何获得解决方案 正常 的做法是 In 子报告将文本放
  • 转发到su目录时如何从url中删除子目录?

    在共享服务器上 我被迫从 cpanel 管理域的文档根 这是有问题的并且消耗大量时间 所以我将所有域重定向到一个目录root 一个例子 sd1 domain com gt public html web sd2 domain com gt
  • 钩子相当于 componentWilLReceiveProps 来更新状态

    所以我有一个组件 可以有条件地更新道具更改的状态 如果当前状态的 CurrentPage 不等于下一个 props CurrentPage 我用下一个 props 的 CurrentPage 更新状态 public componentWil
  • 如何在 HTML 页面中使用 Google 字体

    我见过人们在他们的网站中使用谷歌字体 如何在我的网站中使用 Google 字体 我使用的是普通字体 例如 Arial 和 Verdana 但我也想使用 Source Sans Pro 和 Ubuntu 字体 我该怎么办 访问 Google
  • WCF 服务名称和绑定名称

    Scenario 我有两个 WCF 服务组合在一个 App Config 文件中 我无法运行该程序 应用程序可以编译 但在服务初始化时失败 Question 我想知道是否需要将服务名称设置为与也定义为整体服务一部分的其他名称相同 ERROR
  • C#/.NET 的 MQ 统计监控

    我们与之交易 MQ 数据的供应商之一有一个监视器 显示以下内容 我自己编写了一个 C 监视器 每 x 分钟拍摄一次队列深度的快照 但我想知道如何获取排队和出队的消息数 在我看来 这两个统计数据具有不同的性质 对我来说 队列深度是在给定的时间
  • 在 QTableWidget 中选择行和列,同时保持突出显示

    我设置了一个 QTableWidget 您无法选择单元格 但可以通过标题选择行 列 我遇到的问题是 当我选择一行时 它会取消选择已选择的任何列 列 行也是如此 我希望能够选择具有 ExtendedSelection 行为的行和具有 Sing
  • Tensorflow:参数无效:断言失败:[“预测”包含负值]

    我正在尝试使用tensorflow keras 创建一个FCN 调用 model fit 时出现以下错误 0 Invalid argument assertion failed predictions contains negative v
  • Android:notifyDataSetChanged();不工作

    我在服务器中有一个数据库 我从平板电脑上从数据库中的一个表中获取一些值 我将此信息正确加载到列表中 但我想知道为什么当发生更改时 即使我使用也没有任何反应notifyDataSetChanged 我必须说 为了加载加载数据 您使用 Asyn
  • Struts2在jsp中显示pdf文件

    我的要求是使用数据库中的一些数据创建一个动态报告 pdf 文件 我正在使用 iText 进行此操作 现在 我想在网页中内联显示这个 pdf 文件以及菜单 页眉 页脚等 因此 如果用户有一些 pdf 查看器 那么该 pdf 应该显示在用户计算
  • 使用phonegap从Blackberry 10平台拒绝访问PHP - 已关闭

    我的phonegap 项目在黑莓模拟器上运行时遇到问题 版本是10 当我说 PhoneGap 时 我还没有使用任何 Cordova 功能 但我的简单 javascript 函数一开始就无法工作 我点击了一个按钮 调用了 Javascript
  • 通过谓词进行整数比较

    我正在使用核心数据 其中有一个名为 Scan 谁有一个属性说电子ID这是属于NSNumber类型 现在假设在数据库中我有 3 个条目Scan属性 该实体的一项条目有 35 个electronic id 该实体的第二个条目有 354 个ele
  • 正则表达式在字符串中搜索日期

    我想用 javascript 搜索字符串中的日期 例如 string search dateReg 然后 显示我找到它的日期 我在 http regexr com 3eoib 它适用于我的字符串 27 11 or 27 11 2016 但它
  • Chrome devtools 配置文件火焰图中的这个差距意味着什么

    这是我的 JavaScript 代码 非常简单 console profile var count 1000 var fn1 function for var i 0 i lt count i console log THIS IS FN1
  • Google Analytics 异步事件推送有限制吗?

    我有一段代码 可以在应用程序初始化时根据一组数据记录 Google Analytics 中的事件 它是这样的 function recordInitialData dataArray for var i dataArray length i
  • C++:当两个类包含指向另一个类的指针时,如何解决派生类之间的模板循环依赖?

    我有一个父类和一些从它派生的类 我想将两个派生类 配对 每个派生类都有一个指向另一个派生类的指针 代码示例 template