C++ 中的 Python 函数装饰器相当于什么?

2023-11-27

我正在将 Python 指标库移植到 C++。 Python 库提供的一个 API 是函数装饰器,可以轻松记录函数的计时数据。通过将函数定义修改为

@timed('timing.foo')
def foo():
    ...

foo_result = foo()本质上变成了

start = time.time()
foo_result = foo()
post_metric_to_endpoint('timing.foo', time.time() - start)

In C++ 中的函数挂钩, 我们发现这个答案它包装了实例,并将调用计时函数的负担置于调用者身上,这意味着我们无法在整个代码库中获取性能数据(一开始更新很烦人,而且以后很容易忘记)。相似地,这个答案 to 在 C++ 中以优雅的方式计时需要更改调用站点。这个另一个答案这个问题提供了一种包装任意代码块的方法,这在理论上意味着我们可以缩进我们想要计时的函数的整个主体并将其嵌套在一个范围内。这是我发现的最接近我想要的,但是相当丑陋,相当具有侵入性,而且我不确定对性能的影响。

由于这是一个库,我们可以修改我们想要计时的函数的源代码;事实上,正如我所愿,这是更好的选择every对该函数的调用要计时。大多数讨论似乎都集中在开发中的临时分析上,而我正在尝试构建一个在生产环境中始终处于活动状态的系统。


尽管 C++ 没有对装饰器的显式语言支持,但事实证明您可以使用 C++14 泛型 lambda 很好地“模拟”它们。这是我的看法:

#include <iostream>

template<class T>
auto decorator(T&& func)
{
    // we create a closure below
    auto new_function = [func = std::forward<T>(func)](auto&&... args)
    {
        std::cout << "BEGIN decorating...\n"; 
        auto result = func(std::forward<decltype(args)>(args)...);   
        std::cout << "END decorating\n";
        return result;
    };
    return new_function;
}

int f(int x)
{
    std::cout << x * x << '\n';
    return x * x;
}

auto decorated = decorator(f);
auto double_decorated = decorator(decorator(f));

int main()
{
    decorated(5);
    double_decorated(10);
}

Live on Coliru

当然,在装饰器内部,您可以添加任何您想要的内容(包括计时等),上面只是一个最小的示例。 如果它看起来太令人畏惧,你可以忽略std::forward和 C++14 广义 lambda 捕获并且简单地有

#include <iostream>

template<class T>
auto decorator(T func)
{
    // we create a closure below
    auto new_function = [func](auto... args)
    {
        std::cout << "BEGIN decorating...\n"; 
        auto result = func(args...);   
        std::cout << "END decorating\n";
        return result;
    };
    return new_function;
}

int f(int x)
{
    std::cout << x * x << '\n';
    return x * x;
}

auto decorated = decorator(f);
auto double_decorated = decorator(decorator(f));

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

C++ 中的 Python 函数装饰器相当于什么? 的相关文章

  • C# 打印问题(RichTextBox)

    我想打印我的 RichTextBox eintragRichTextBox 的内容 我现在有这个代码 private void druckenPictureBox Click object sender EventArgs e PrintD
  • 多个源的 makefile

    在学习 make 文件时 我试图为多个源目录编写一个 make 文件 似乎我在某个地方错了 这是我的代码结构 directory common fun2 c inc fun h src fun1 c main c 这是我的生成文件 CC c
  • 添加 Nullable int 时保持 null?

    我想添加可为空的int 并保留null当所有值都是null 我想要这个结果 1 2 3 1 null 1 null null null O null 0 问题是 如果我将一个值与 null 相加 结果为 null int i1 1 int
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 删除是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 C 编程 free 如何知道要释放多少 https stackoverflow com questions 1518711 c programming how does free know how m
  • CSharpRepl emacs 集成?

    我碰巧知道莫诺CSharpRepl http www mono project com CsharpRepl 是否有 emacs csharp 模式使用它在一个窗口中运行 REPL 并像 python 模式一样在另一个窗口中编译 运行 C
  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • 从模板切换传递的类型

    在 C 中是否可以检查传递给模板函数的类型 例如 template
  • 在 omp 并行 for 循环中使用 unique_ptr 会导致 SEG.FAULT

    采取以下代码 include
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • 析构函数中的异步操作

    尝试在类析构函数中运行异步操作失败 这是代码 public class Executor public static void Main var c1 new Class1 c1 DoSomething public class Class
  • 引用/指针失效到底是什么?

    我找不到任何定义指针 引用无效在标准中 我问这个问题是因为我刚刚发现 C 11 禁止字符串的写时复制 COW 据我了解 如果应用了 COW 那么p仍然是一个有效的指针并且r以下命令后的有效参考 std string s abc std st
  • 如何使用 NPOI 按地址(A1、A2)获取 Excel 单元格值

    我有一个 Excel 单元格地址 例如 A1 A2 如何使用 C 中的 NPOI 框架以编程方式访问此单元格 我找到的一些 Java POI 示例代码 CellReference cr new CellReference A1 row my
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • 在 OpenGL 中渲染纹理 1 到 1

    所以我想做的是使用 OpenGL 和 C 将纹理渲染到平面上 作为显示图像的一种方式 但是我需要确保在渲染纹理时没有对纹理进行任何处理 抗锯齿 插值 平滑 模糊等 这是 OpenGL 处理渲染纹理的默认方式吗 或者是否需要设置一些标志才能禁
  • 在 C#.NET 中安全删除文件

    在我正在做的一个项目中 我想为用户提供 安全 删除文件的选项 例如 用随机位或 0 覆盖它 在 C NET 中是否有一种简单的方法可以做到这一点 效果如何 你可以调用系统内部删除 http technet microsoft com en
  • 如何调试 .NET 运行时中的内部错误?

    我正在尝试调试一些处理大文件的工作 代码本身works 但 NET 运行时本身会报告零星错误 对于上下文 这里的处理是一个 1 5GB 文件 仅加载到内存中一次 在循环中处理和释放 故意尝试重现此否则不可预测的错误 我的测试片段基本上是 t
  • 为什么匹配模板类上的部分类模板特化与没有模板匹配的另一个部分特化不明确?

    这个问题可能很难用标题中的句子来描述 但这里有一个最小的例子 include

随机推荐

  • 以编程方式设置时 UITextView selectedRange 不显示

    我的问题是以编程方式设置 UITextView 的 selectedRangeselects文字 但是does not直观地表明它已被选中 这听起来像是 OS 3 0 3 1 中的错误吗 更重要的是 有什么解决方案或建议可以显示选择 示例项
  • 单击按钮后使用 Selenium 切换到新窗口

    我正在开发一个非常简单的网页项目 但遇到了一些困难 我正在使用一个网站 填写表格并单击按钮后 我会在新窗口中打开 XML 文档 从而获得所需的数据 但是 我不知道如何访问它 因为没有给出窗口名称 browser Browser firefo
  • 如何从SQL Server查询数据?

    我在从数据库查询数据以在 VB NET 中制作报告时遇到问题 我使用业务对象来制作报告 这是我的示例数据 Id Item Unit Unit Price Quantity Amount
  • Python:与 list.remove 混淆

    我对 Python 很陌生 很抱歉这个可能很简单的问题 虽然我现在花了2个小时才找到答案 我简化了代码来说明问题 side 5 eva side print str side side before print str eva eva be
  • 限制Spritekit游戏中GUI元素的比例

    由于帖子太大 我提前道歉 但是每个尝试过制作某种通用应用程序的人都知道这是一个相当有问题的东西 所以请对我宽容一些 The goal 我想要实现的目标 如上图所示 是在 iPhone 5 和 6 上使用 2x 资源 并保持应用程序的相同外观
  • 动态模块/服务配置和 AOT

    我需要根据运行时开关动态配置一些 Angular 服务 在 AOT 之前的几天 我使用以下代码让它工作 NgModule imports HttpModule providers export class MyModule static f
  • 将地址分配给整型变量

    为什么你可以像这样给整型变量分配地址 编译器不会给出错误 我一直认为你只能将整数值分配给整数变量 int a 0x28ff1c 您可以对 char 变量执行相同的操作 编译器不会给出错误 char b 0x28ff1c 它将在控制台屏幕上输
  • 是否可以为整个应用程序设置自定义字体?

    我需要在整个应用程序中使用某种字体 我有相同的 ttf 文件 是否可以在应用程序启动时将其设置为默认字体 然后在应用程序的其他地方使用它 设置后 如何在布局 XML 中使用它 是的 有反思 这有效 基于这个答案 注意 这是由于缺乏对自定义字
  • NSSoftLinking - 在(空)框架中找不到函数“SLSIsSuppressedByScreenTime”

    在 macOS Catalina 测试版 上 我在 Xcode 11 测试版 中创建了一个新的 macOS 项目 在创建向导中 我选择 Objective C 和 使用 XIB 如果我运行该项目 我会得到以下控制台输出 foo projec
  • 从 Google Dataflow 访问 GKE 中运行的 HTTP 服务

    我有一个在 Google Container Engine 集群上运行的 HTTP 服务 位于 kubernetes 服务后面 我的目标是使用固定名称从在同一 GCP 项目上运行的 Dataflow 作业访问该服务 就像可以使用 DNS 从
  • 外部组件引发异常:Visual Studio 2010:SEHException:是什么原因导致的? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我在调试项目时收到此错误消息 外部组件抛出异常 昨天下
  • 如何柯里化任意数量的 JavaScript 函数?

    假设我有一些功能 function g a b c return a b c 我想将其转换为 柯里化 形式 在引号中 因为它本身并不完全柯里化 function h a b c switch true case a undefined b
  • 如何显示我的可可触摸框架故事板屏幕?

    我创建了一个带有故事板的简单 Cocoa touch 框架 在我的框架中 我有一个 MainViewController swift 视图控制器 我创建了一个新的单视图项目 导入了我的框架并尝试加载我的框架视图控制器 但我得到了黑屏 我不知
  • adb wait-for-device 和 adb wait-for-devices 之间有什么区别吗?

    我使用了两个命令来等待设备出现 adb 等待设备和 adb 等待设备 两者似乎都在等待设备启动 我没有发现它们的行为有任何区别 他们的行为有什么不同吗 添加有关我所做的更多信息 所以这就是我所做的 从android文档中我使用了adb wa
  • JAX WS 客户端无法进行身份验证

    我正在尝试在标准 JAVA 7 JAX WS 工具的帮助下使用安全 HTTPS 模式 Web 服务 此网络服务需要身份验证 我已经成功将证书添加到我的本地 java 密钥库 我在 WSDL 文件的帮助下生成了所有需要的类wsimport t
  • 将段落或单元格旋转任意角度——Itext

    我有一个网站 用户可以在其中上传照片并创建相册 此外 他们还可以在绝对位置 旋转和对齐方式添加文本 文本可以有新行 我一直在使用 Itext 库来自动创建稍后打印的高质量 Pdf 相册 将用户上传的图像添加到 PDF 中非常简单 但当我尝试
  • 如何在Python中的qrcode中心插入标志?

    我在 python 中使用 pyqrcode 模块并用它生成 QR 码 如何将徽标放在二维码的中央 代码看起来像这样 import pyqrcode data Hello World number pyqrcode create data
  • 为什么 C# 中 Int32 结构体的 MinValue 前面有两个减号?

    当我右键单击时int在我的代码中并选择 转到定义 Visual Studio 将打开一个标题为 Int32 来自元数据 的文件 该文件包含以下行 public const Int32 MinValue 2147483648 双 符号是什么意
  • Delphi XE5中的Android后台服务

    我需要为android编写一些服务 使用德尔福XE5 火猴 该服务需要在后台运行并定期读取短信收件箱 将其写入 sqlite DB 短信备份 我知道如何读取短信以及如何将其写入数据库 但我不知道如何使应用程序作为服务在后台工作 有任何想法吗
  • C++ 中的 Python 函数装饰器相当于什么?

    我正在将 Python 指标库移植到 C Python 库提供的一个 API 是函数装饰器 可以轻松记录函数的计时数据 通过将函数定义修改为 timed timing foo def foo foo result foo 本质上变成了 st