异常安全蹦床的设计模式

2023-12-13

这个问题源于here。然而,上一个问题的措辞非常糟糕(实际上是错误的),以至于建议我从头开始再问一次。

我有一个 C 函数指针表。

一些 C 代码(让我们称之为 lib-X)有一个基本构建块(让我们称之为 X 对象)。每个 X 对象都可以调用该表上的函数。

这些表函数通常具有不同的签名(请参阅 typedefhere),尽管多个函数可以共享相同的签名。表中大约有 100 个这样的函数。

在 C++ 中,每个 X 对象都有一个关联的 Final:Base 类。

我想将这些调用转发到 X 对象对应的 C++ Final 实例,但我想将其包含在 try/catch 中,因为 C++ 使用者可能会提供有错误的 Final。

所以我有一个 C++ 基类,它为表中的每个条目都有一个虚函数。

然后我有一个从基类派生的 C++ Final 类(可能有很多;Final1 Final2 Final3 等)。

所以现在我只需要编写一个处理程序

  1. 获取第一个“self”参数(它始终是指向调用该函数的 X 对象的指针)

  2. 检索关联的 C++ 基类实例。

  3. 在 try catch 块内,调用相应的虚函数,通过以下方式转发所有剩余参数:

  4. ...这实际上会调用 Final 中的覆盖。

这有点像试图理解《盗梦空间》的情节。 lib-X 实际上是 Python 运行时,尽管我试图保持通用性。

问题是这样的函数有几十个,这会导致一些非常混乱且难以维护的 C++ 代码——如果我必须为每个函数手动编写一个蹦床函数,如下所示:

extern "C" PyObject *call_handler( PyObject *self, PyObject *args, PyObject *kw )
{
    try
    {
        PythonExtensionBase *p = getPythonExtensionBase( self );
        if( kw != NULL )
            return new_reference_to( p->call( Object(args), :Object(kw) ) );
        else
            return new_reference_to( p->call( Object(args), Object() ) );
    }
    catch( Py::Exception & )
    {
        return NULL; // indicate error
    }
}

(source here)

我正在尝试提出一种紧凑的设计,以实现这种异常安全的蹦床运动。

我当前的进度是[已删除,请参阅下面的答案]


像这样的东西?

template<typename RET, class ...Args> // <-- one trap for each f in Base that gets enabled!
RET trap( RET (Base::*f)(Args...), void* self, Args&&...args )
{
    try {
        auto base = reinterpret_cast<Base*>(self);
        return (base->*f)(std::forward<Args>(args)...);
    }
    catch (...) {
        return (RET)0;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异常安全蹦床的设计模式 的相关文章

  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span

随机推荐

  • 日语的 Unicode 范围

    我正在尝试区分英语和日语字符 我需要找到所有日语字符的 Unicode 范围 所有日语字符的 Unicode 范围是多少 正如扎维图提到的 这一页有几个 unicode 范围的参考 总结一下范围 日式标点符号 3000 303f 平假名 3
  • 在脚本中使用 Bugzilla Perl API 时如何进行身份验证?

    工作从Bugzilla API 我编写了一个快速 Perl 脚本来克隆 Bugzilla 产品 在新产品下重新创建所有组件 Bugzilla Perl API 非常容易从命令行使用 我本来可以直接处理数据库 但我想要一个长期的解决方案 另一
  • 如何在指定计数后中断 xsl 中的表行?

    我有以下 xsl 按字母顺序对 xml 进行排序
  • 组合设计模式:如何将结果从一个组件传递到另一个组件?

    我有以下代码 interface IService void Execute class ServiceA IService public void Execute class ServiceB IService public void E
  • Python:匹配之间的连续行类似于 awk

    Given 多行字符串string 已经从文件中读取file 两种图案pattern1 and pattern2它将匹配恰好一行中的子字符串string每个 这些线将称为 line1 和 line2 这些模式是正则表达式模式 但如果这样更容
  • 将带有 NodaTime 自动道具的模型发布到 WebAPI

    我们正在项目中使用 NodaTime 作为时间 日期模型 该项目是一个Web应用程序 使用WebAPI 当尝试发布包含 LocalTime autoprops 的模型时 我们收到 InsufficientExecutionStackExce
  • 无法解析 com.android.support:recyclerView-v7:26.1.0

    在我的应用程序中 我使用 RecyclerView 因为我在 Gradle 中添加了依赖文件 之后由于我在标题中放入的错误 我无法运行我的项目 Gradle apply plugin com android application andr
  • 显示器 ID 和序列号

    在 Windows 中 我们有有关 Monitos 的信息 一些唯一的名称和 ID 例如 Acer xxx 三星xxx 我想知道如何在 C 中获取信息 因为我知道我们可以从 WMI 获取序列号 根 WMI gt WmiMonitorID 以
  • 如何从 Azure 网站计划作业连接远程 SFTP

    我有一个控制台应用程序 它将被安排为 AZURE 网站中的作业 我想从该控制台应用程序连接远程 SFTP 并获取所有文件并将它们保存在 AZURE 网站内的我的文件夹中 此外 如果可能的话 在传输后将它们从 SFTP 中删除 首先 在这种情
  • Delphi 中的递归类实例大小

    Delphi中有没有办法获取类实例的实际大小 我知道 TObject 类的 InstanceSize 方法 但该方法不会为对象成员递归调用自身 例如 假设我们有两个类 type MyClass1 class private myVar1 i
  • 确认 TF2 在训练时使用我的 GPU

    我想知道在按照 TF 教程中的建议将训练数据存储在 GPU 上后 是否有办法确认我的 TF 模型正在 GPU 上进行训练 这是一个简短的代码示例 import tensorflow as tf print Num GPUs Availabl
  • 如何通过脚本向现有的谷歌表单项添加验证?

    我正在尝试为我的谷歌表单文本项添加验证 特别是文本验证 然而 在我看来 setValidation 函数仅适用于已知类型的项目 例如TextItem 据我了解 如果我通过拉取表单项 getItemById 我会得到一个通用物品 它仍然具有
  • 执行标量以在没有返回记录的情况下捕获错误

    我有下面的代码 Dim lJobName As String SQLCommand CommandText Select JobName from Jobs where Id Id SQLCommand Parameters Add New
  • 合并属于每个标准的不同产品

    我必须转换以下xml内容
  • React,状态设置器不更新值[重复]

    这个问题在这里已经有答案了 useState 无法设置文件对象 我在代码中添加了注释来解释发生的情况 const file setFile useState
  • 自定义控件中的组属性

    在我们的 IDE 例如 Visual Studio 中 如果我们显示 System Windows Forms Button 控件的属性 我们会看到一些公开另一组属性的属性 例如 平面外观 字体 位置 边距 等等 我想在自定义控件中做类似的
  • 在 ASP.NET Core Web 应用程序中使用 Identity 登录期间向用户添加声明

    Edit 2 终于想通了 查看下面已接受的答案 Edit 按照 Jason Pan 的指示 我尝试了完整的源代码 https github com affableashish blazor server auth tree feature
  • Angular 2 用空值实例化类

    如何将成员实例化为具有空值的类 Plunkr 我实例化为 public members new MemberClass 但控制台显示 Members 所以我无法设置默认的空值 所以基本上我正在尝试复制一个空结构 例如 this member
  • Highcharts - yAxis 最大数据刻度间隔

    我正在尝试动态设置最大数字的最大值 我不确定我哪里做错了 有什么帮助吗 在线演示 预期的 我得到什么 PS 我想找到最大值 例如 本例中为 100 并表明第一个 yAxisLabel 和下一个值应为负 20 等 图1 数值 39 35 19
  • 异常安全蹦床的设计模式

    这个问题源于here 然而 上一个问题的措辞非常糟糕 实际上是错误的 以至于建议我从头开始再问一次 我有一个 C 函数指针表 一些 C 代码 让我们称之为 lib X 有一个基本构建块 让我们称之为 X 对象 每个 X 对象都可以调用该表上