【发布时间】:2017-12-26 17:31:30
【问题描述】:
使用 /clr 标志编译托管 C++ 代码时,编译器不允许包含。我正在尝试将我的非托管 C++ 代码移植到托管 C++ 环境中。我看到 C# 有替代 Task 和 TaskCompletionSource 来替换期货和承诺,但我没有看到托管 C++ 中提供这些选项。我需要与一些 C++ 非托管库执行互操作,因此我无法完全切换到 C#。我仍然需要一个 C++ 层。如何在托管 C++ 中实现未来/承诺功能?
下面是一个 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 中执行此操作
【问题讨论】:
-
总是有回调和状态机来做异步。
-
我不明白你的问题。使用 c++-cli 显然可以混合原生和托管。我们可以使用“includes”和“using namespaces”。
-
@SchLx 当您尝试使用 /clr 标志编译托管或非托管代码时,不允许使用
包含。那怎么还能用呢? -
好的,我明白了:我们得到:错误消息“使用 /clr 或 /clr:pure 编译时不支持
。” -
@SchLx 在创建这篇文章之前,我已经查看了文档。在 ppltasks.h 中有一个使用
task对象的解决方案。这类似于Task在 C# 中所做的。但我没有看到TaskCompletionSource的等价物,这就是承诺。