托管 C++ 中 future 和 Promise 的替代方案是什么

2023-12-11

当使用 /clr 标志编译托管 C++ 代码时,编译器不允许包含。我正在尝试将非托管 C++ 代码移植到托管 C++ 环境中。我看到 C# 有替代方案 Task 和 TaskCompletionSource 来替代 futures 和 Promise,但我没有看到这些选项在托管 C++ 中可用。我需要与一些 C++ 非托管库执行互操作,因此我无法完全切换到 C#。我仍然需要中间有一个 C++ 层。如何在托管 C++ 中实现 future/promise 功能?

下面是 C++ 中非托管代码的示例,该代码在不使用 /clr 标志的情况下进行编译:

int Foo(std::future<int> &fur) {
    int result = 1;
    int value = fut.get();
    // Do something with value

    return result;
}   

int main() {
    int x;
    std::promise<int> p;
    std::future<int> f = p.get_future();
    std::future<int> fut = std::async(Foo, std::ref(f));
    int val = 1;
    p.set_value(val);
    x = fut.get();
}    

我希望能够在 C++/CLI 中执行此操作


Update (一些早期的评论在这里重新表述):

即使我们选择公共语言运行时支持(C++-Cli、CLR),许多标准 C++ 库也可以免费使用。但有些是不可用的,例如被质疑的。

如果我们添加这样的标头,我们会收到以下错误:

' <future>使用 /clr 或 /clr:pure 编译时不受支持。 '

这对我们来说意味着这样的代码可能会保留在单独的 dll 中,或者我们必须重构我们的代码,或者我们需要上述库的 C# 实现,例如this one.

Answer:

问题本身包含正确的答案,因此未来和素数可以使用以下代码来实现:

  • Task<T>是一个未来(或单位返回未来的任务),
  • TaskCompletionSource<T>是一个承诺,

帖子中也显示了here。这意味着我们可以简单地searchC# 替换 future 和 Promise,然后将它们翻译为 C++-Cli。

在我的回答中我只展示了一些关键点如何翻译和使用Task并内置代表。任务本身很简单:

    #include "stdafx.h"

    using namespace System;
    using namespace System::Threading::Tasks;

    public ref class MyActions
    {
    public:
        MyActions()
        {
            // lambdas are not allowed for managed class so we use built in delegates
            auto t = gcnew Task(gcnew Action<Object^>(task1),this);
        }

    public:
        static void task1(Object^ o)
        {
            // TODO:
            printf("Hello World! [c++-cli] and [win32]");
        }
    };

正如您所看到的,C++-Cli 语法与 c# 非常相似,并且您仍然拥有大部分“旧”C++。

NOTE:我们仍然应该将类定义和实现分开(myactions.h 和 myactions.cpp)

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

托管 C++ 中 future 和 Promise 的替代方案是什么 的相关文章

  • C++/CLI:CA2123:需要 SecurityCriticalAttribute?

    我对这样的错误有点迷失 警告 7 CA2123 Microsoft Security 添加以下安全属性 到 RithmicConnector 连接 字符串 为了匹配基地的 LinkDemand 方法 IConnector Connect S
  • C# 中如何实现引用返回?

    既然 C GC 可以移动内存 那么如何实现引用返回呢 下面的代码会导致 未定义的行为 吗 public struct Record public int Hash public VeryLargeStruct Data public cla
  • 将 std::vector 转换为 .NET List 的最有效方法是什么?

    将 std vector 转换为 NET 列表的最有效方法是什么 为了提供一些背景信息 我使用 C CLI 包装了一个非托管 C 类 C CLI 类保存一个指向 C 类的指针 并且我为每个公共方法都有一个包装器 一种方法返回 std vec
  • C# - 具有 new() 约束的泛型如何生成机器代码?

    public T Foo
  • 带有托管 C++ dll 的加载程序锁定(regsvr32 R6033 错误)

    我有一个 C dll 它实现了多个 COM 接口 我正在尝试将其迁移到托管 C 我设置了 clr 编译器标志并将运行时库属性从 MT 更改为 MD 以避免这两个标志之间的冲突 但这就是我所做的全部更改 当它尝试在构建过程中注册 dll 时
  • C++ 虚(密封)函数

    我在我的 C 项目中使用 dll 中的类 一切都工作正常 直到 当尝试调用某个方法 在对象浏览器中列出 时 我收到一条错误消息 指出该方法不是命名空间的成员 经过调查 我注意到该方法被列为 virtual void x seal 有没有办法
  • 将泛型类转换为接口

    我在将泛型类转换为它正在实现的接口时遇到问题 我的代码是这样的 interface foo void foobar class bar foo public void foobar throw new NotImplementedExcep
  • VC++ 代码 DOM 可以从 VS 插件访问吗?

    Visual Studio IntelliSense for VC 包括 完整 EDG C 解析器 http www edg com location c frontend 英特尔和其他公司也使用 由于插件可以访问 C Code DOM 如
  • 检查文件是否是 .NET 程序集

    我见过一些方法通过检查二进制结构来检查 PEFile 是否是 NET 程序集 http www anastasiosyal com archive 2007 04 17 3 aspx 这是测试多个文件最快的方法吗 我假设尝试加载每个文件 例
  • unsigned char* 缓冲区到 System::Drawing::Bitmap

    我正在尝试创建一个工具 资产转换器 使用以下命令将字体光栅化为 XNA 游戏的纹理页面自由类型2 http www freetype org freetype2 index html engine 下面 第一张图片是FreeType2的直接
  • 非虚实例方法继承是如何解决的?

    通过 C 从 CLR 引用 它读起来就像call将在运行时通过 CLR 搜索由基类型定义的方法 Then callIL指令用于调用实例或虚拟 方法中 您必须指定一个引用对象的变量 方式 变量本身的类型指示定义该方法的类型 CLR 应该调用
  • ASP.NET 解决方案的本机程序集绑定失败

    NOTE 这个问题的主要目的是理解 解释CLR 的程序集绑定行为 一旦确定原因 解决方案就应该显而易见 请注意 我知道我的设置不是最佳的 nativedll 未签名和版本控制等 但我只是想调查 CLR 的绑定行为 我正在尝试在我的 asp
  • 使用带有终结器的 C++/CLI 定义类时 C# 中的内存泄漏

    当我在 C CLI DLL 中实现一个类时 public ref class DummyClass protected DummyClass some dummy code std cout lt lt hello lt lt std en
  • .net 运行时 - Silverlight 运行时 =?

    我用 google 搜索了一下 但没能找到 net CLR 中的哪些类未包含在 CoreCLR 又名 Silverlight 中的详细列表 Windows net Framework 中缺少什么 Silverlight 另外 是否存在 Si
  • 使用 C++/CLI 包装非托管 C++ 类库 - 问题 2 - 集合

    Note 这篇文章代表了我的询问的问题 2 两个问题中都会重复介绍部分 达到数字之前的所有文本 因为它是回答问题可能需要的背景信息 问题简介 我有一个非托管 C 库 其中包含多个 更高级别 库所共有和共享的类和函数 我现在需要向 C Net
  • C# 如何 P/调用 NtRaiseHardError

    以下 C 代码会导致蓝屏 include stdafx h include
  • c++/cli 终结器中免费 GCHandle 的最佳实践

    我在 c 中有一些函数 我会在 net 应用程序中使用它 为此 我用 C cli 编写了一个包装器类 C 接口中有一个回调函数 并将其包装在 net 委托中 但是我应该如何释放回调 gcHandle 的非托管资源呢 是否允许在终结器中从 G
  • 有没有办法使用 win API 获取 HRESULT 值的字符串表示形式?

    win API 中是否有函数可用于提取 HRESULT 值的字符串表示形式 问题是 MSDN 中并未记录所有返回值 例如执行默认应用程序域 http msdn microsoft com en us library ms164411 asp
  • 如何获取我的应用程序已创建的应用程序域的列表?

    我有一个服务应用程序 它在长时间运行的任务的使用过程中创建AppDomain 我一直通过将它们存储在具有唯一 ID 的哈希表中来跟踪它们 任务完成后 服务应用程序会卸载分配给该任务的 AppDomain 然后将其从 appdomain 哈希
  • 混合 MFC 和 WPF:模态对话框

    我使用 C CLI 界面层将 C WPF 对话框添加到现有的 C MFC 应用程序 我一切正常 只是我遇到了形式问题 例如 MFC 应用程序使用 ShowDialog 显示 WPF 对话框 按预期工作 该 WPF 对话框显示使用 DoMod

随机推荐

  • .NET Web浏览器控制和Dispose()

    我知道这是一个热门话题 有很多问题和答案 但我仍然没有找到以下问题的解决方案 我有一个多选项卡应用程序 每个选项卡上都有一个 Webbrowser 控件 由于网络浏览器为每个新选项卡占用更多内存 并且它们不会在选项卡关闭时释放此内存 因此我
  • fullcalendar - 如何使用 ajax 加载日历上的所有事件

    我想在页面加载时使用 Ajax 加载完整日历中的所有事件 我收到来自 Ajax 的响应 但该事件未添加到完整日历中 这是我的 jquery 代码 calendar fullCalendar theme true header left pr
  • 如何在 MATLAB 中填充两条直线和一条不直的曲线之间的区域(该区域不是多边形)

    使用 matlab 的 FILL 函数创建一个由直边多边形限定的填充区域 不幸的是 这在上图中留下了一个小的白色区域 因为我想要填充的区域的边界不是直边多边形 而是在左侧有一个弯曲的边界 我有一条曲线 几乎是抛物线 但不完全是 我想填充两条
  • 使用 MATLAB 分离图像中两个重叠的圆

    如何使用 MATLAB 将下图中两个相连的圆分开 我尝试过使用imerode 但这并没有给出好的结果 腐蚀不起作用 因为为了腐蚀得足以将圆圈分开 线条会消失或被破坏 在其他起始图片中 圆和线重叠 因此隔离重叠的对象也不起作用 该图像显示了通
  • SBT 在 Build.scala 中指定 java 堆大小

    我的 Build scala 文件内容 val commonSettings Seq version 1 0 0 organization com collective scalaVersion 2 11 4 scalacOptions L
  • ActionBarSherlock 和 ActionBar 兼容性之间的差异

    有什么区别动作栏夏洛克 and 操作栏兼容性 几天前 谷歌刚刚发布了 ActionBar 兼容性 这让我很困惑 Action Bar Compatibility 的工作原理与 ActionBarSherlock 相同并且编码相同吗 示例 是
  • Spring MVC 错误“NoSuchMethodError”

    我收到以下错误 请给我一些建议 我在用spring sts SEVERE StandardWrapper Throwable java lang NoSuchMethodError org springframework web conte
  • 解构中的 ES6 计算属性 - 解构整个对象

    我有这个变量 var a b 1 c 2 d rawr rawr 10 我想将它们解构到本地范围内 所以我这样做 var b c d a 这工作正常 但我需要得到rawr出去 我试过这个 var b c d a d a 但这给了我missi
  • Excel VBA:如何使用给定代码循环浏览同一文件夹中的工作簿?

    上一篇文章 我需要创建一个宏 循环遍历单个文件夹中的文件并运行我在下面提供的代码 所有文件的结构都相同 但是数据不同 该代码帮助我转到指定的目标文件并计算列中 YES 的数量 然后它将其输出到 CountResults xlsm 主工作簿
  • 相对于另一个向量对一个向量进行排序 - 最有效的方法?

    我知道这个问题已经 被问到 a few times 但对于简单的情况 其中紧凑性 可读性或用户熟练程度是决定因素 提供了不同的答案 我不确定哪一个是最有效率的 因为我担心重复该操作O 1M 次 设置如下 两个向量A and B of flo
  • 当多个活动处于活动状态时如何关闭应用程序

    我开了3个活动 现在用户想要退出应用程序 为此我必须完成所有活动 不建议这样做 但我的应用程序希望向用户提供这样的退出点 当多个活动处于活动状态时如何关闭应用程序 Thanks Android 中任何应用程序的所有活动都使用相同的进程 ID
  • 在 Angularfire 中什么时候使用 $asArray 和 $asObject ?

    看来有很多情况可以选择是否使用 asArray or asObject 在同样的情况下 你可以使用其中任何一个来逃脱 我是一位代码 js 初学者 但是什么时候应该使用 asArray 和 asObject 最新版本的角火1 0 0使用新的
  • 如何使用 Bison 实现“隐式乘法”规则?

    我正在为数学表达式解析器编写 Bison 文件 到目前为止 一切都很好 但我面临着隐式乘法的问题 你看 我想支持这样的表达2x sin 4x cos 4x 它应该像这样解析2 x sin 4 x cos 4 x 这里没什么太糟糕的 但请考虑
  • 数组什么时候在c中充当指针?

    我知道数组名称可以用作指针 尽管它是转换后的形式 但我的问题是 是否还有其他实例将数组用作指针 从技术上讲 数组名永远不会充当指针 一个 具有数组类型 可以是数组名称 的表达式将转换 每当数组类型不合法但指针类型合法时 都指向指针 并且数组
  • 将 FrameLayout 转换为位图

    我有一个 FrameLayout 其中包含一些图像视图和一个 EditText 我将此布局保存为内存中的图像 外部 第一次 当我在 imageviews 中设置图像时 一切都很顺利 即正在保存确切的图像 与屏幕上显示的相同 但是第一次保存后
  • Matplotlib 滚动条

    我有一个线泛化算法 并且想在图中添加一个滚动条 以增加容差 即使线变得越来越泛化 使用 matplotlib 这怎么可能 总而言之 我希望能够单击并拖动滑块 以显示线上公差效果的增加 仍然在努力解决这个问题 我只想要一个从 1 到 10 的
  • 如何将“IsDirty”属性添加到 LINQ to SQL 实体?

    我将我的实体绑定到 WPF 中的编辑表单 在 DataTemplate 中 我希望能够设置 DataTemplate 中根容器的背景颜色 以显示它已更改并且这些更改尚未提交到数据库 这是一个非常简单的示例 演示了我正在谈论的内容 请原谅错误
  • 使用 css 强制抗锯齿:这是一个神话吗?

    最近 一位客户抱怨 IE6 中系统字体的外观 基本上这个问题是 IE6 不支持字体平滑 抗锯齿 我知道你可以在操作系统设置或其他设置中打开它 但有人扔掉了这个宝石 您可以使用 pt 而不是 px 来强制 css 中的字体反锯齿 我在各种浏览
  • 使用 JHipster 将新字段添加到现有实体

    当我尝试向现有实体添加新字段时遇到问题 我运行这个命令 yo jhipster entity Libro 和我选择 BETA 是的 添加更多字段和关系 但是当我尝试使用 mvnw 编译我的项目时 我收到此错误http pastebin co
  • 托管 C++ 中 future 和 Promise 的替代方案是什么

    当使用 clr 标志编译托管 C 代码时 编译器不允许包含 我正在尝试将非托管 C 代码移植到托管 C 环境中 我看到 C 有替代方案 Task 和 TaskCompletionSource 来替代 futures 和 Promise 但我