如何确保一个函数只被调用一次

2024-03-15

假设我有一个名为 caller 的函数,它将调用名为 callee 的函数:

void caller()
{
    callee();
}  

现在,调用者可能在应用程序中被多次调用,而您希望确保被调用者仅被调用一次。 (一种延迟初始化),您可以使用标志来实现它:

void caller()
{
    static bool bFirst = true;
    if(bFirst)
    {
        callee();
        bFirst = false;
    }
}

我对此的看法是它需要更多代码,并且在函数调用者的每次调用中都需要进行一次检查。
对我来说更好的解决方案如下:(假设被调用者返回 int)

void caller()
{
    static int ret = callee();
}  

但是如果被调用者返回 void,这无法处理这种情况,我的解决方案是使用逗号表达式:

void caller()
{
    static int ret = (callee(), 1);
}  

但这样做的问题是,逗号表达式并不常用,人们看到这行代码时可能会感到困惑,从而给维护带来问题。

您有什么好主意来确保函数只被调用一次吗?


你可以用这个:

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

如何确保一个函数只被调用一次 的相关文章

随机推荐

  • java swing中N个jtable的同步滚动

    我需要将 N 个表并排排列在网格窗格中 前提是所有 jtable 的滚动窗格高度保持相同 现在我想同步所有 jtable 的滚动 这意味着如果我滚动第一个 jtable 那么其余的 jtable 应该自动滚动相同的量 有人对此有任何想法吗
  • Net::HTTP 对 HTTPS 请求的响应极其缓慢

    由于某种原因 在我的开发机器上 通过 Net HTTP 执行的 HTTPS 请求的响应非常非常慢 我尝试过 RestClient 和 HTTParty 它们都有同样的问题 它似乎不知从何而来 我已经提出了数百次这些请求 没有任何问题 但今天
  • Sql连接查询

    我有三张桌子 tblLink LinkId LinkName GroupId SubGroupId GroupId 和 SubGroupId 是 tblGroup 和 tblSubGroup 中的外键tblGroup 组ID 组名称 tbl
  • 在 Python 中查看 Popen 管道流

    背景 Linux 上的 Python 2 6 6 DNA 序列分析流程的第一部分 我想从已安装的远程存储 LAN 读取可能经过 gzip 压缩的文件 以及它是否经过 gzip 压缩 gunzip 将其压缩到流中 即使用gunzip FILE
  • Mysql UPDATE ON DUPLICATE KEY 仅插入

    我正在尝试运行一个查询 以便它将插入或更新重复项 我正在为重复项使用唯一索引 但我似乎无法让它工作 它还增加了新记录 希望一些新的目光能够指出我的问题 谢谢 这是我的架构 CREATE TABLE IF NOT EXISTS pricing
  • gmtime_r 和 gmtime_s 之间的区别

    这两个函数有什么区别呢 我正在使用 MinGW 4 8 0 我知道gmtime r是线程安全的 但如果从同一线程多次调用则不安全 但我不明白gmtime s 不同之处在于gmtime r 3 http linux die net man 3
  • 使用 Kotlin 关闭/隐藏 Android 软键盘

    我正在尝试用 Kotlin 编写一个简单的 Android 应用程序 我的布局中有一个 EditText 和一个按钮 在编辑字段中写入并单击按钮后 我想隐藏虚拟键盘 有一个热门问题 关闭 隐藏 Android 软键盘 https stack
  • Rails Paperclip:更新与 update_attributes

    当我尝试通过回形针 gem 为我的用户模型 在头像属性下 上传图像时 我意识到一些非常奇怪的事情 由于某种原因 User update 和 user update attributes 的行为有所不同 有谁知道为什么会这样 using us
  • find_packages 找不到我的 Python 文件

    我有一个像这样的目录树 dir A init py something py I used find packages on dir A并期望它能找到something py 但是 它返回一个空列表 我该如何制作find packages
  • 如何在 Seaborn 图中设置色调顺序

    我有一个名为的 Pandas 数据集titanic我正在使用以下代码绘制 Seaborn 官方文档中所述的条形图 import seaborn as sns titanic sns load dataset titanic sns catp
  • 如何使用单个文本框根据任何列数据过滤行

    我在用ng table http bazalt cms com ng table 我尝试使用中给出的过滤器example http bazalt cms com ng table example 4 但为了过滤每一列 我需要有单独的文本框
  • Rails - 对象在视图中可用,但对象的属性不可用?

    我遇到一个不寻常的问题 我可以访问对象 但不能访问视图中的属性 非常感谢任何帮助 指导 这是我的模型 app models team member rb class TeamMember lt ApplicationRecord attr
  • IntelliJ 2017.2 卡在“新项目”>“Maven”的“正在加载原型列表”上

    选择时Create New Project启动 IntelliJ 2017 2 后的选项 我在Maven标签 写着 正在加载原型列表 有什么办法可以得到 Maven 原型吗 我刚刚在 2017 年 2 月 3 日 刚刚更新 在 Fedora
  • 隐藏特定内容页的状态栏

    我正在创建一个应用程序 我想在特定页面上隐藏状态栏 在我的示例中 它是一个内容页面 我发现了几个使用 info plist 来隐藏它的示例 但我只想将其用于特定页面 这可能吗 使用 NavigationPage SetHasNavigati
  • 如何将 androidx.recyclerview.widget.RecyclerView 与 tools:listitem 一起使用?

    如何使用androidx recyclerview widget RecyclerView with tools listitem 我有这样的布局
  • 检查 html5 视频是否准备就绪

    如果 HTML5 视频准备好播放 是否会触发 JavaScript 事件 刚刚遇到这个问题 虽然它有点旧 但我将其发布给未来的读者 他们像我一样 可能来自谷歌 截至今天 这是 html5 媒体的事件列表 根据 W3C onabort 中止时
  • 提供的实体包含具有无效值的关系

    当我将应用程序上传到 App Store Connect 时出现以下错误 The provided entity includes a relationship with an invalid value is not a valid ID
  • C++ 错误:“内联”只能出现在函数上

    我正在尝试编译VCMI http forum vcmi eu portal php在 OS X 10 7 下使用 clang 我配置了项目CXX clang 因为苹果的 gcc 似乎不识别 required std c 0x flag 我已
  • 我需要在 Python 中安全地存储用户名和密码,我有哪些选择? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在编写一个小型 Python 脚本 它将使用用户名和密码组合定期从第三方服务中提取信息 我不需要创建 100 防弹的东西 100 真的存在吗
  • 如何确保一个函数只被调用一次

    假设我有一个名为 caller 的函数 它将调用名为 callee 的函数 void caller callee 现在 调用者可能在应用程序中被多次调用 而您希望确保被调用者仅被调用一次 一种延迟初始化 您可以使用标志来实现它 void c