有没有什么方法可以强制实例仅位于堆栈上?

2024-05-17

我有一个 C++ 类,我只希望它在堆栈上实例化。我正在使用 API 来访问用另一种(解释型)语言开发的内容,该语言带有自己的垃圾收集功能。这种语言中的机制足够了解,可以将它找到的引用单独保留在堆栈上的任何内容,并且由于该本机类包含这样的引用,因此对于正确的行为,本机 C++ 类的用户所做的操作至关重要永远不要尝试在其他地方分配它的实例。

请注意,我不仅想禁止为我的类的实例分配 new (如果这是我需要做的全部,我可以重载该类的实例)new运算符并将其设为私有,或从 C++11 起显式删除它),但也不允许该类的任何静态或可能的全局实例。安全地实例化此类的唯一有效方法应该是在堆栈上,我想以某种方式保证这一点。据我所知,制作newprivate 或删除它也不会阻止另一个类与我的类一起声明为成员变量以及在堆上分配的实例。

我现在的管理方式是将“Local”一词作为类名称的一部分,以友好地提醒用户该实例仅用于堆栈,但当然,这不是“实际上不是由编译器或任何其他机制强制执行的,我更喜欢一个更具可执行性的解决方案。

理想情况下,我想在编译时确保这一点,如果使用不正确,则编译失败。如果这根本不可能,那么在构造实例时在运行时抛出异常仍然是可接受的后备方案。在 C++11 或 C++14 中工作的解决方案都很好。

请注意,这个问题肯定是NOTthis https://stackoverflow.com/questions/124856/how-do-i-prevent-a-class-from-being-allocated-via-the-new-operator-id-like其一,只想防止分配new


免责声明:据我所知,“堆栈”不是 C++ 标准的一部分,我们有 ASDV(自动存储持续时间变量)。 ABI 可能会定义堆栈。请注意,有时这些会在寄存器中传递,我相信这在您的情况下是可以的。

定义一个CPS(连续传递风格)工厂方法:

class A {
public:
   template<typename F, typename... Args>
   static auto cps_make(F f, Args&&... args) {
      return f(A(std::forward<Args>(args)...));
   }
private:
   A(/* ... */) {}
   A(const A&) = delete;
   A(A&&) = delete;
};

用法:传递一个采用 A 和 A 的 ctor 参数的 lambda。

return A::cps_make([&](A a) {
   /* do something with a */
   return true;
});

函数参数始终是内部的 ASDV。

代码如何工作:cps_make 采用一个函子(通常是 lambda),该函子采用给定类型的实例;和可选的 ctor 参数。它创建实例(通过将任何可选参数转发给构造函数),调用函子并返回函子返回的内容。由于仿函数可以是 C++11 中的 lambda,因此它不会破坏正常的代码流程。

CPS 的美妙之处在于,您只需在 C++14 中使用 auto-lambda 即可拥有静态多态性:您的 cps_make() 可以创建您想要的任何内容(层次结构、变体、任意等)。然后,您可以节省封闭层次结构的虚拟开销。您甚至可以为正常流程设置一个 lambda,在 ctor 失败时设置一个 lambda;当例外情况不可行时,这会很方便。

缺点是,目前您无法在 lambda 内部直接使用外部作用域的控制流语句。 /* 提示:我们正在努力。 */

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

有没有什么方法可以强制实例仅位于堆栈上? 的相关文章

随机推荐

  • 如何获取 Windows Phone 7 的 useragent 字符串?

    我需要获取手机的用户代理字符串 但我在 API 中没有找到任何允许这样做的内容 我遇到过以下两篇描述用户代理字符串格式的博客文章 http blogs msdn com b iemobile archive 2010 03 25 ladie
  • 使用 javascript 更改 div 颜色

    div style height 20px width 100 background color 000000 div br
  • R中整数类和数字类有什么区别

    我想先说我是一个绝对的编程初学者 所以请原谅这个问题是多么基本 我试图更好地理解 R 中的 原子 类 也许这适用于一般编程中的类 我理解字符 逻辑和复杂数据类之间的区别 但我正在努力寻找数字类和整数类之间的根本区别 假设我有一个简单的向量x
  • 当鼠标悬停在伪元素上时触发CSS动画?

    我试图在伪元素悬停时触发 CSS 动画 我目前有 2 个视频 显示鼠标悬停在浏览器的 50 一侧 我想应用类似的效果来为某些文本添加动画效果 我想要 p 标签在移动时向上移动并淡入 p h1 同时以同样的方式标记 就像这个网站一样 http
  • 通过pm2运行node.js,但经常重新启动:通过信号[SIGINT]以代码[0]退出

    我试图在我的系统上运行 node js 但遇到了这个问题 2016 06 01 20 46 28 App app with id 13 and pid 12633 exited with code 0 via signal SIGINT 2
  • React-Native 打包器失败:模块名称重复

    这在开发过程中似乎是随机发生的 当尝试跑步时npm start or react native run ios 我收到以下错误 Failed to build DependencyGraph providesModule naming co
  • 归并排序中递归树的高度log(n)+1是怎么来的

    我按照 stackoveflow 的建议阅读了一些问题和答案 我正在遵循 cormen 的 算法简介 一书进行自学 那本书里已经解释得很清楚了 但唯一没有解释的是如何在合并排序分析中计算树的高度 如果在后面的章节中对此进行解释的话 我仍然在
  • 如何最大限度地提高服务器性能?

    我一直在努力了解性能和可扩展性 并想知道开发人员 系统管理员正在做什么来提高他们的系统的效率 为了标准化答案 如果您能尽力回答以下任一问题 将会有所帮助 Profile Magazine publication on Joomla Jobs
  • 为什么按钮上的 maxWidth 不起作用以及如何解决它?

    我的布局上有两个按钮 在大屏幕设备 平板电脑 上我想限制它们的宽度 这样它们看起来就不会很荒谬 我希望使用 maxWidth 属性 但它显然在我的场景中没有任何作用 这是布局定义 按钮使用布局的整个宽度 忽略 maxWidth 中的任何值
  • 在 Javascript 中获取第一个数字出现后的子字符串

    我正在尝试提取第一个数字之后 并包括 的字符 ABC 123SD gt 123SD 123 gt 123 123SD gt 123SD ABC gt 我当前的解决方案如下 var string1 ABC 123SD var firstDig
  • 使用“,”运算符是否被认为是不好的形式?

    我创建了一个列表类 作为替换程序中用于初始化需要包含不断变化的元素列表的对象的可变参数函数的方法 列表类有一个我非常喜欢的使用语法 但是我以前没有见过它被使用过 所以我想知道我是否不应该因为这个事实而使用它 列表类的基本实现如下所示 inc
  • 如何在 R 中绘制一列与其余列的关系图

    我有一个数据集 其中 1 是时间 接下来的 14 个是幅度 我想在一张图表上散布所有大小与时间的关系 其中每个不同的列都是网格化的 分层在另一个之上 我想使用原始数据来制作这些图表 并单独制作它们 但只想执行此过程一次 数据集A 唯一的自变
  • 2018年通过网站链接打开Facebook应用程序的正确方法?

    首先我要说的是 我已经研究了这个问题四个小时了 从各种线程中 我看到链接到fb page PAGEID is the OLD通过网站链接打开 Facebook 应用程序的方式fb facewebmodal f href FACEBOOKUR
  • 格里特:! [远程拒绝] HEAD -> refs/publish/master (没有新的更改)

    我做了一些更改 提交了它们并将分支推送到 Gerrit git push gerrit 现在我的更改没有出现在 Gerrit 中 我认为这是因为我手动推送更改而不是使用git 审查 https github com openstack in
  • 为什么 C 语言可以越界写入?

    我最近读完有关虚拟内存的内容 我有一个关于 malloc 在虚拟地址空间和物理内存中如何工作的问题 例如 从另一个SO帖子复制的代码 void main int p p malloc sizeof int p 500 999999 prin
  • 编译时未定义对“WinMain@16”的引用

    我刚刚安装视觉工作室代码当出现这个问题时 我正在尝试运行我的代码 编译时未定义对 WinMain 16 的引用 我在网上搜索了相关答案 但没有找到有效的答案 这里有一个更详细的output在控制台中 cd f g testing cpp o
  • Quartz.Net CronExpression 生成器

    我有一些 GUI 控件形成一个典型的 Windows 调度程序 日期 时间选择器 复选框等 我想从中构建 CronExpression 字符串 有谁知道构建表达式字符串的好方法 无论是预先存在的类还是解决此问题的好方法 Quartz Net
  • 上传时的 Google Drive API——这些额外的空行从何而来?

    总结一下该程序 我从我的 Google 云端硬盘下载一个文件 然后在本地计算机中打开并读取一个文件 file a txt 然后在我的计算机中打开另一个文件 file b txt 处于附加模式 并且在使用这个新的 file b 更新我的 Go
  • 使用 AVFoundation 裁剪 AVAsset 视频

    我在用AVCaptureMovieFileOutput录制一些视频 我使用显示预览层AVLayerVideoGravityResizeAspectFill稍微放大 我遇到的问题是最终的视频较大 包含预览期间不适合屏幕的额外图像 这是预览和生
  • 有没有什么方法可以强制实例仅位于堆栈上?

    我有一个 C 类 我只希望它在堆栈上实例化 我正在使用 API 来访问用另一种 解释型 语言开发的内容 该语言带有自己的垃圾收集功能 这种语言中的机制足够了解 可以将它找到的引用单独保留在堆栈上的任何内容 并且由于该本机类包含这样的引用 因