当使用 /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(使用前将#替换为@)