两个交互类的基于可变参数模板的多重继承...

2023-12-29

在我当前的项目中,我需要能够提供基于模板的多重继承(Mixin 模式)and有两个可以一起交互的类(具有镜像多重继承树)(即一个类在同一继承级别使用另一个类的方法)。

长话短说,我似乎找不到一种优雅的方式来构建它。下面是一个简化的测试用例(您可以直接运行并编辑它here http://ideone.com/6JY2ut).

是否有一种模式或技巧可以让我拥有与注释行类似的内容,同时保持任何子类相对简单?

显然,嵌套的Thing类需要从另一个提供必要接口方法的类继承。然而,任何修复继承问题(CRTP ...)的尝试似乎总是导致我遇到递归继承或不完整的基类型问题......

class Base {
public:

    class Thing {
    public:
        Thing(Base& b) : _b(b) {};

        Thing& operator+= (const Thing p) { _b.add(*this, p); return *this; };

        int k;
    protected:
        Base& _b;
    };

    void add(Thing &d, const Thing s) { d.k += s.k; }
};

template <class... Interfaces>
class Extensible : virtual public Base, virtual public Interfaces... {

    class Thing : virtual public Base::Thing, virtual public Interfaces::Thing... {

    };
};

class SomeInterface : Base {
    void multiply(Thing &d, const Thing s) { d.k *= s.k; }

    class Thing : public Base::Thing {
        Thing& operator*= (const Thing p) {
            //_b.multiply(*this, p); return *this; // <-- won't work of course
        };

    };

};

int main() {
    Extensible<SomeInterface> a;
    return 0;
}

这是选项之一:http://ideone.com/KhLyfj http://ideone.com/KhLyfj(我只是告诉基类它的子类是什么_b正确的类型)。但在某些情况下它不起作用。您可以尝试将模板从Thing/add直接到Base.

class Base {
public:

    template<typename Outer>
    class Thing {
    public:
        Thing(Base& b) : _b(b) {};

        Thing& operator+= (const Thing p) { _b.add(*this, p); return *this; };

        int k;
    protected:
        Outer& _b;
    };

    template<typename Outer>
    void add(Thing<Outer> &d, const Thing<Outer> s) { d.k += s.k; }
};

template <class... Interfaces>
class Extensible : virtual public Base, virtual public Interfaces... {

    class Thing : virtual public Base::Thing<Base>, virtual public Interfaces::template Thing<Base>... {

    };
};

class SomeInterface : Base {
    void multiply(Thing<SomeInterface> &d, const Thing<SomeInterface> s) { d.k *= s.k; }

    class Thing : public Base::Thing<SomeInterface> {
        Thing& operator*= (const Thing p) {
            _b.multiply(*this, p); return *this; // <-- will work of course
        };

    };

};

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

两个交互类的基于可变参数模板的多重继承... 的相关文章

  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • 当我单击 C# 中的“取消”按钮时重定向到新页面(Web 部分)

    Cancel button tc new TableCell btnCancel new Button btnCancel Text Cancel btnCancel Click new EventHandler btnCanel Clic
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • “MyClass”的类型初始值设定项引发异常

    以下是我的Windows服务代码 当我调试代码时 我收到错误 异常 CSMessageUtility CSDetails 的类型初始值设定项引发异常 using System using System Collections Generic
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • 通过等待任务或访问其 Exception 属性都没有观察到任务的异常

    这些是我的任务 我应该如何修改它们以防止出现此错误 我检查了其他类似的线程 但我正在使用等待并继续 那么这个错误是怎么发生的呢 通过等待任务或访问其 Exception 属性都没有观察到任务的异常 结果 未观察到的异常被终结器线程重新抛出
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • 为什么我使用google'smtp'无法发送电子邮件?

    我有以下程序使用 smtp gmail com 587 发送电子邮件 namespace TestMailServer class Program static void Main string args MailMessage mail
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12

随机推荐

  • Bootstrap 中心垂直和水平对齐

    我有一个页面 其中仅存在表单 并且我希望将表单放置在屏幕中央 div class container div class row justify content center align items center div div
  • 为什么这种隐式转换的使用不起作用?

    我定义了一个通用类 Lazy
  • 使用 PreferenceActivity 时刷新首选项视图

    我试图强迫PreferenceActivity刷新 有谁知道如何做到这一点 我有一个ResetDefaultsPreference子类的类Preference并且 当单击时 应该将其键以特定前缀开头的所有首选项重置为默认值 它有效 但是当我
  • iOS - 尝试播放 mp3 文件失败

    我正在尝试播放从我的应用程序的服务器检索的 mp3 文件 执行以下操作 IBAction play UIButton sender dispatch queue t downloadQueue dispatch queue create a
  • 使用 Python 将 .csv 文件分成块

    我有一个超过 300 GB 的大型 csv 文件 我想将其分成每个 100 000 000 行的较小文件 每行大约有 55 60 字节 我写了以下代码 import pandas as pd df pd read csv path to r
  • 模态视图控制器和 DefinePresentationContext 的问题

    我使用以下命令创建了一个自定义容器视图控制器新的 UIViewController 容器视图控制器方法 http developer apple com library ios documentation uikit reference U
  • Google Analytics 上是否有设置禁止尚未同意的用户使用 cookie

    根据欧盟电子隐私指令 又名 Cookie 法 第 5 3 条 针对欧盟用户的网站在设置 Cookie 之前必须获得用户的选择同意 See ICO 指导 http www ico gov uk media documents library
  • 在 R Shiny Dashboard 中的反应函数中返回数据帧

    使用闪亮的仪表板 ui r server r 和多个包含函数的 r 脚本 基本问题是 我有两个数据集带入 server r 中 并将它们传递给准备 清理数据集的函数 然后将它们绑定在一起并应返回完整的数据帧 数据帧应该是反应性的 这是我到目
  • python scipy/numpy 中的多项式 pmf

    scipy numpy 中是否有内置函数用于获取多项式的 PMF 我不确定是否binom以正确的方式概括 例如 Attempt to define multinomial with n 10 p 0 1 0 1 0 8 rv scipy s
  • rustup 将自身安装到哪里?

    我明白那个rustup安装rustc and cargo二进制文件到 cargo bin 但是它安装在哪里rustup可执行到 据我所知 任何文档中都没有对此进行解释 并且运行安装程序也不会告诉您 如果可能的话 我想避免将其安装到除我的主目
  • ASP.NET 代码块(例如 <%= %>)在页面生命周期中何时执行?

    当我对整个页面进行数据绑定时 我会执行以下操作 巴拉巴拉 这效果很好 但是 我通常不会对整个页面使用数据绑定 而是以 经典 ASP NET 方式编写内容 例如 在后面的代码中我将有类似的内容 lblSomeMessage Text Some
  • 在表单的 clean 方法期间读取文件数据

    所以 我正在努力实现答案我之前的问题 https stackoverflow com questions 2798670 processing file uploads before object is saved 这是我的模型 class
  • Visual Studio 2010 警告:未指定的错误(HRESULT 异常:0x80004005 (E_FAIL))

    我看到很多关于此错误的帖子 但似乎都与我的情况无关 我有一个小型解决方案 包含 2 个 winforms 应用程序和一个数据访问 DLL 我使用的是 VS2010 SP1 当我在 Vista Business 32 位 SP1 笔记本电脑上
  • 如何使用引导网格映射图像数组?

    我正在使用 gatsby js 构建一个投资组合网站 所有照片都发布在 WordPress 中 由 graphQL 获取并渲染到网站 我正在尝试使用 bootstrap grid 来组织照片并使其响应 但是因为 graphQL 返回一个数组
  • 为整个应用程序创建一个公共对象

    我创建了一项活动 用于创建用户个人资料并存储其信息 例如姓名 ID 个人资料图片等 该信息是唯一的 应该在应用程序的所有活动中使用 我想知道创建一个存储所有信息并在所有活动中使用它的通用对象的最佳方法是什么 我已阅读有关捆绑包和 JSON
  • Python - 使用 SAML 2.0 登录站点

    我很难找到资源来帮助我解决我遇到的问题 我有一个使用 SAML 2 0 保护的网站 有人可以向我指出显示如何使用 SAML 2 0 登录站点的资源吗 大多数 python 模块似乎都与实现 SAML 2 有关 我只需要登录到实现 SAML
  • 如何解析 REST 服务的 POST 参数?

    看来我还有另一个 JSON 问题 这次是在发布到 REST 服务时 我在用Flask Restful api add resource Records rest records
  • 如何使用 rand-int 生成可重复的随机序列

    我希望能够使用生成可重复的数字rand在 Clojure 中 具体来说 我想要调用的结果rand nth或Incanter的sample可重复 这些称为rand int这又调用rand 我想通了这个问题 https stackoverflo
  • 如何从静态方法访问控件?

    我有一个 C NET 应用程序 其中有一个MainForm和几节课 这些类之一接收来自网络的传入数据消息 我需要将这些消息的文本附加到多行文本框中MainForm 我可以将消息发送到中的方法MainForm通过使方法静态 但静态方法无法访问
  • 两个交互类的基于可变参数模板的多重继承...

    在我当前的项目中 我需要能够提供基于模板的多重继承 Mixin 模式 and有两个可以一起交互的类 具有镜像多重继承树 即一个类在同一继承级别使用另一个类的方法 长话短说 我似乎找不到一种优雅的方式来构建它 下面是一个简化的测试用例 您可以