有没有办法简化以下代码,以避免.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
}
答案 0 :(得分:1)
template <typename T>
MyStack<T>::MyStack()
: top(nullptr)
{
}
template <typename T>
MyStack<T>::~MyStack()
{
}
是一个模板类,因此concurrency::task
和concurrency::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>
实例。