在 C++ 中模拟 CLOS :before、:after 和 :around

2024-03-20

CLOS 有一个简洁的 :before、:after 和 :around 方法概念。

  • :before 方法在主要方法之前调用。
  • :after 方法在主要方法之后调用。
  • :around 方法是围绕 :before+primary+:after 序列调用的。

:before、:after 和 :around 方法是链接的而不是重写的。假设父类和子类都定义了 foo 方法和 :before foo 方法。子级的 foo 方法会覆盖父级的 foo 方法,但子级和父级的 :before foo 方法都会在调用此覆盖的方法之前调用。

Python 装饰器提供了类似于 CLOS :around 方法的东西。 C++ 中没有这样的东西。必须用手卷:

class Child : public Parent {
    virtual void do_something (Elided arguments) {
        do_some_preliminary_stuff();
        Parent::do_something (arguments);
        do_some_followup_stuff();
    }
};

缺点:

  • 对于某些人来说,这是一种反模式。
  • 它要求我明确指定父类。
  • 它要求我的课程的扩展者遵循相同的范例。
  • 如果我需要打电话给祖父母怎么办,因为父母没有覆盖do_something,那么多重继承呢?
  • 它并没有完全体现 CLOS 概念。

当我使用 Flavors(CLOS 的前身)时,我发现这些概念非常方便。我在一些地方使用了上述解决方法,并且一些地方将其作为反模式提出了挑战。 (其他人在其他地方也效仿过,所以这种嘲笑并不普遍。)

问题:这是否被认为是 C++ 中的反模式,是否有更好的解决方法?


您可以使用以下方法很好地了解这方面的基础知识(std/boost)::shared_ptr。详细信息请参见这里:http://www.boost.org/doc/libs/1_46_1/libs/smart_ptr/sp_techniques.html#wrapper http://www.boost.org/doc/libs/1_46_1/libs/smart_ptr/sp_techniques.html#wrapper

获得您提到的继承行为只需要前缀/后缀函数来调用父类中的前缀/后缀函数。

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

在 C++ 中模拟 CLOS :before、:after 和 :around 的相关文章

  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 使用 GCP 的数据存储区时如何区分代码是在模拟器中运行还是在 GKE 中运行

    按照中给出的说明进行操作后 我不确定是否遗漏了任何内容https cloud google com datastore docs tools datastore emulator https cloud google com datasto
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 这个可变参数模板示例有什么问题?

    基类是 include
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone

随机推荐

  • iPhone UITableView:如何删除组样式表中各部分之间的间距?

    我正在创建一个表格视图 其中有 10 个部分 所有部分都有标题视图 但没有单元格 所以 简而言之 我的表视图将仅显示 10 个标题视图 任何部分都不会有单元格 现在 当我这样做时 该部分的标题视图之间有一些空间 我想删除那个空格 那可能吗
  • 在 Flutter 中显示几秒钟后没有执行操作按钮时关闭 AlertDialog

    我有一个 AlertDialog 弹出几秒钟 然后自动弹出 没有执行任何操作按钮 弹出后 会显示另一个AlertDialog 我怎样才能做到这一点 这是我的示例代码 初始化计时器以显示第一个对话框 timerToShowFirstDialo
  • AVFoundation,在预览层中剪掉边缘

    我正在开发一些 iOS 应用程序 我需要在其中进行一些相机扫描 这是我第一次体验 AVFoundation 之前我使用 UIImagePickerController 开发相机应用程序 但 AVFoundation 似乎更强大 问题是它会切
  • 使用 doPost 将文件上传到 Google Web Apps

    我正在尝试使用 doPost e 将文件上传到 Google Web App 如下所示 function doPost e var blob e parameter myFile DriveApp createFile blob 然后将文件
  • Intel x86 与 AMD x86 CPU 上的访问性能不一致

    我已经实现了一个带有结构内存布局数组的简单线性探测哈希图 该结构包含键 值和指示条目是否有效的标志 默认情况下 该结构体由编译器填充 因为键和值是 64 位整数 但该条目仅占用 8 个布尔值 因此 我也尝试以未对齐访问为代价来打包结构 由于
  • 使用 pdfnet 下划线会导致不同的线条粗细

    我用来为所选文本添加下划线的代码 我开始调用 addUnderline 方法 其他方法是辅助方法 private pdftron SDF Obj CreateUnderlineAppearance pdftron PDF Rect bbox
  • Python 和 numpy:从 1 维数组中逐行减去 2 维数组

    在python中 我希望从1维数组中逐行减去2维数组 我知道如何使用 for 循环和索引来完成此操作 但我认为使用 numpy 函数可能会更快 但是我没有找到办法做到这一点 这是一个带有 for 循环的示例 from numpy impor
  • 文件 -> 在 MonoDevelop 中打开网站?

    我无法在 MonoDevelop 中打开现有网站 我尝试了各种选择但没有成功 有什么办法可以做到这一点吗 Visual Studio 有这个功能并且运行得很好 但我想在我当前的项目中尝试使用 MonoDevelop MonoDevelop
  • 在 Linux 中如何判断哪个进程向我的进程发送了信号

    我有一个java应用程序SIG TERM 我想知道发送这个信号的进程的pid 那可能吗 两种 Linux 特定的方法是SA SIGINFO http www kernel org doc man pages online pages man
  • 如何获得 TreeNodes 的 TreeView 行为,当您检查一个 TreeNodes 时,它会检查其所有子 TreeNodes?

    这与大多数应用程序的行为方式相同 我认为 TreeView 默认情况下是这样工作的 有没有办法做到这一点 或者我是否必须获取已检查的 TreeNode 的所有子节点并自己检查它们 这是winform 你需要自己做 但另一方面这并不难 pri
  • 块范围内没有链接?

    块中声明的所有变量是否都 无链接 例如 1 如果我声明一个静态变量 void foo static int i 它有内部联系还是没有联系 如果没有链接 那为什么要使其静态呢 2 如果我使用 extern 会发生什么 global scope
  • 检测迭代器是否会被消耗

    是否有一种统一的方法来知道迭代是否会消耗可迭代对象 假设你有一个特定的函数crunch它要求一个可迭代对象作为参数 并多次使用它 就像是 def crunch vals for v in vals chomp v for v in vals
  • 便携式 JPA 批量/批量插入

    我刚刚开始使用其他人编写的一个功能 该功能似乎效率稍低 但我对 JPA 的了解并不足以找到非 Hibernate 特定的可移植解决方案 简而言之 在循环中调用的 Dao 方法插入每个新实体会执行 entityManager merge ob
  • 删除具有多个 ul 的特定列表样式[重复]

    这个问题在这里已经有答案了 举个例子 我有两个列表 1st ul li TEST 1 li li TEST 2 li li TEST 3 li li TEST 4 li li TEST 5 li li TEST 6 li li TEST 7
  • Pytorch 数据加载器:错误的文件描述符和 EOF > 0

    问题描述 在使用由自定义数据集制作的 Pytorch 数据加载器进行神经网络训练期间 我遇到了奇怪的行为 数据加载器设置为workers 4 pin memory False 大多数时候 训练都顺利完成 有时 训练会随机停止 并出现以下错误
  • RMarkdown 无法编织:找不到 html_dependency

    我正在尝试使用创建一个 html 文件RMarkdown 使用 RStudio 中的示例 Rmd 当我点击Knit 我收到以下消息 错误 找不到 html dependency 的路径 执行已停止 我尝试卸载并重新安装 R 和 RStudi
  • 如何向AudioQueue提供音频缓冲区来播放音频?

    在我的应用程序中 我正在接收需要播放的线性 PCM 格式的音频数据 我正在关注 iOS SpeakHere 示例 但是我不知道应该如何以及在哪里提供缓冲区AudioQueue 谁能给我提供一个在 iOS 中播放音频缓冲区的工作示例Audio
  • 为什么在调试模式下 List<>.OrderBy LINQ 比 IComparable+List<>.Sort 更快?

    我感兴趣的是使用 LINQ 对类进行排序更快 还是通过实现 IComparable 接口和 List Sort 更快 当 LINQ 代码更快时 我感到非常惊讶 为了进行测试 我创建了一个非常简单的类 使用不太恰当的名称 TestSort 实
  • 如何以编程方式获取 Camera RAW 元数据信息 Android

    我有一个应用程序 它以编程方式设置相机的硬件参数 然而 据我所知 并且观察到 并非所有芯片组都支持所有参数 例如 Nexus 4 高通 具有清晰度和清晰度最大参数 而 Galaxy Note II 3g 则没有 因此 当我设置清晰度参数时
  • 在 C++ 中模拟 CLOS :before、:after 和 :around

    CLOS 有一个简洁的 before after 和 around 方法概念 before 方法在主要方法之前调用 after 方法在主要方法之后调用 around 方法是围绕 before primary after 序列调用的 befo