2016-04-25 59 views
0

我需要做條件行爲。有條件的std :: future和std :: async

std::future<int> f = pointer ? std::async(&Class::method, ptr) : 0; 

// ... Some code 

x = f.get(); 

所以我想分配給ptr->method()來電或0 x結果異步的結果,如果ptrnullptr

上面的代碼是否正常?我可以做任何這樣的事情嗎(分配'int'到'std :: futture'?或者也許有更好的解決方案嗎?

回答

3

std::future沒有轉換constructor所以你的代碼是無效的(你會注意到,如果你真實目的是試圖編譯代碼)。

你可以做的是使用默認構造的未來,然後檢查它是否valid使用未來之前。

2

您可以加載一個值到未來,而無需使用像這樣的線程:

std::future<int> f; 

if (pointer) 
    f = std::async(&Class::method, ptr); 
else 
{ 
    std::promise<int> p; 
    p.set_value(0); 
    f = p.get_future(); 
} 

// ... Some code 
x = f.get(); 

但一個更簡單的方法來達到同樣的目標將是:

std::future<int> f; 

if (pointer) 
    f = std::async(&Class::method, ptr); 

// ... Some code 
x = f.valid() ? f.get() : 0; 
0

您可以爲其它情況下也返回std::future(使用不同的策略):

std::future<int> f = pointer 
    ? std::async(&Class::method, ptr) 
    : std::async(std::launch::deferred, [](){ return 0;}); 
相關問題