2016-04-25 14 views
0

Ich muss bedingtes Verhalten tun.Bedingte Std :: Future und Std :: Async

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

// ... Some code 

x = f.get(); 

So würde Ich mag auf x Ergebnis async Ergebnis ptr->method() Anruf oder 0 zuweisen, wenn ptr ein nullptr ist.

Ist der obige Code in Ordnung? Kann ich so etwas tun (‚int‘ auf ‚std :: futture‘? Zuweisen Oder vielleicht ist es eine bessere Lösung?

Antwort

3

std::future keine Konvertierung haben constructor so Ihren Code nicht gültig ist (wie Sie, wenn Sie bemerkt haben würde tatsächlich versucht, den Code zu kompilieren).

Was können Sie tun, ist eine Standard-konstruierte Zukunft zu verwenden, und dann prüfen, ob es valid ist, bevor Sie die Zukunft nutzen.

2

Sie einen Wert in die Zukunft laden kann, ohne ein Faden wie folgt:

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(); 

Aber ein einfacher Weg, um das gleiche Ziel zu erreichen wäre:

std::future<int> f; 

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

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

Sie zurückkehren können auch ein std::future für Ihren anderen Fall (mit verschiedener Politik):

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