有没有办法简化下面的代码,以避免.then调用将我的task<int>“转换”为task<void>
我不能更改MyClass::MyFunction1的函数签名,因为它是公共API的一部分。
task<void> MyClass::MyFunction1()
{
return MyFunction2().then([](int) {});
}
task<int> MyClass::MyFunction2()
{
// Some code here
}发布于 2018-03-31 08:02:18
concurrency::task是一个模板类,因此concurrency::task<int>和concurrency::task<void>是两个不同的类。其中一个的实例不能强制转换或转换为另一个。
因此,您的方法在某种程度上是正确的。但是,您并没有进行转换,您只是创建了一个新的task<void>实例,该实例将在完成后由Method2()返回的task<int>执行。这稍微隐藏了你实际想要做的事情,并且可能会使将来维护代码变得更加困难。我认为更好的方法是创建并返回一个封装Method2()并等待其完成的task<void>:
concurrency::task<void> MyFunction1()
{
return concurrency::task<void>{[]()
{
MyFunction2().wait();
}};
}这更加简单明了,特别是因为调用者接收的task<void>实际上执行MyFunction2()正在执行的任何内容。
无论哪种方式,由于类型不兼容,因此没有办法创建新的task<void>实例。
https://stackoverflow.com/questions/49580523
复制相似问题