将任务<t>转换为任务<void>

时间:2018-03-30 19:46:57

标签: c++ visual-c++ ppl

有没有办法简化以下代码,以避免.then调用&#34;转换&#34;我的task<int>task<void>

我无法更改MyClass::MyFunction1的功能签名,因为它是公共API的一部分。

task<void> MyClass::MyFunction1()
{
    return MyFunction2().then([](int) {});
}

task<int> MyClass::MyFunction2()
{
    // Some code here
}

1 个答案:

答案 0 :(得分:1)

template <typename T> MyStack<T>::MyStack() : top(nullptr) { } template <typename T> MyStack<T>::~MyStack() { } 是一个模板类,因此concurrency::taskconcurrency::task<int>是两个不同的类。任何一个实例都无法转换或转换为另一个实例。

因此,您的方法有点正确。但是,您没有进行转换,只需创建一个新的concurrency::task<void>实例,该实例将在完成后由task<void>返回task<int>执行。这隐藏了你实际上想要做的事情,并可能使将来维护代码变得更加困难。我认为更好的方法是创建并返回封装Method2()的{​​{1}}并等待它完成:

task<void>

这更加直接和干净,特别是因为调用者接收的Method2()实际执行concurrency::task<void> MyFunction1() { return concurrency::task<void>{[]() { MyFunction2().wait(); }}; } 正在执行的任何内容。

无论哪种方式,由于类型不兼容,因此无法创建新的task<void>实例。