2016-04-25 2 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, если ptr является nullptr.

Является ли код выше нормально? Могу ли я сделать что-нибудь подобное (назначить '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;}); 
Смежные вопросы