struct Base {
virtual void squawk () {
std::cout << " I am base" << std::endl;
}
};
struct Derived : public Base {
void squawk () override {
std::cout << "I am derived" << std::endl;
}
};
int main () {
std::future<std::shared_ptr<Base>> f = std::async([](){return std::make_shared<derived> ();})。)
}
這給出了以下錯誤:
這給出了以下錯誤:
這給出了以下錯誤。
錯誤:從'future<shared_ptr<Derived>>'/span>到非標量型別'future<shared_ptr<Base>>'/span>的轉換要求
然而,這樣編譯 :
std::promise<std::shared_ptr<Base> > p;
std::future<std::shared_ptr<Base>> f = p.get_future()。
p.set_value(std::make_shared<Derived>() )。
你能解釋一下原因嗎?推薦的創建期貨的模式是什么,以保持多型性物件?
uj5u.com熱心網友回復:
你必須明確地將make_shared<Derived>()的結果轉換成shared_ptr<Base>:
std::future<std::shared_ptr<Base>> f = std::async( [ ] (){
return std::shared_ptr<Base> {std::make_shared< Derived>()};
});
// or
std::future<std::shared_ptr<Base>> f = std::async( [] () -> std::shared_ptr<Base> {
return std::make_shared<Derived>()。
});
f.get()->squawk(); // I am derived
uj5u.com熱心網友回復:
你的lambda的回傳型別是一個 uj5u.com熱心網友回復: 我將這樣設定,并更多地使用auto關鍵字。
動物工廠為你完成了(隱含的)向基數(介面)的轉換。
因此,lambda保持清潔。
標籤: 上一篇:通過pthread呼叫函式有問題
下一篇:在MFC的OnButtonClick函式中呼叫winuser.h中的GetDesktopWindow()函式而不是CWnd::GetDesktopWindow()。
shared_ptr<Derived>/code>。因此,async將創建的未來包含一個shared_ptr<Derived>。如果你想讓它有一個不同的型別,你需要通過static_pointer_cast將回傳值變成shared_ptr<Base>,使lambda的回傳型別成為正確的型別。
auto f = std::async( [] (){return std: :static_pointer_cast<std::shared_ptr<Base>>std::make_shared<Derived>();})。
#include <type_traits>
#include <iostream>
#include <future>
//-----------------------------------------------------------------------------
//為動物宣告一個介面/抽象基類。
struct animal_itf
{
virtual ~animal_itf() = default;
virtual void make_noise()= 0;
protected:
animal_itf() = default。
};
//-----------------------------------------------------------------------------
struct bear_t final 。
public animal_itf
{
void make_noise() override
{
std::cout << "I am a bear : GROWL" << std::endl;
}
};
struct cat_t final :
public animal_itf
{
void make_noise() override
{
std::cout << "I am a cat : Meow" << std::endl;
}
};
//-----------------------------------------------------------------------------
//動物工廠
template<typename animal_t>
std::shared_ptr<animal_itf> make_animal()。
{
return std::make_shared<animal_t> ()。
}
//-----------------------------------------------------------------------------
int main()
{
auto future = std::async(std:: launch:: async, [](){ return make_animal<cat_t> (); })。
//顯示自動型別是一個持有std::shared_ptr<animal_itf>的未來。
static_assert(std::is_same_v<std::future<std::shared_ptr<animal_itf>>, decltype(future)>)。
auto animal_itf = future.get()。
animal_itf->make_noise()。
}
