Нам было бы неловко игнорировать случай, когда различные функции задачи имеют разные типы возврата. Это означает, что стоимость, возвращенная первым из них, может иметь любой из этих типов. Это можно выразить с помощьюBoost.Variant..
Чтобы упростить пример, мы вернемся к тому, чтобы сделать вид, что никто из них не может сделать исключение. Это<wait_first_value_het()
>сильно напоминает<wait_first_value()
>. Мы можем фактически повторно использовать<wait_first_value_impl()
>, просто пропуская<boost::variant<T0,T1,...>
>как тип значения канала, а не обычный<T
>!
Это может быть использовано.<wait_first_success()
>Семантика.
template< typename ... Fns >
boost::variant< typename std::result_of< Fns() >::type ... >
wait_first_value_het( Fns && ... functions) {
typedef boost::variant< typename std::result_of< Fns() >::type ... > return_t;
typedef boost::fibers::unbounded_channel< return_t > channel_t;
auto channelp( std::make_shared< channel_t >() );
wait_first_value_impl< return_t >( channelp,
std::forward< Fns >( functions) ... );
return_t value( channelp->value_pop() );
channelp->close();
return value;
}
Его можно было бы назвать так:
boost::variant< std::string, double, int > result =
wait_first_value_het(
[](){ return sleeper("wfvh_third", 150); },
[](){ return sleeper(3.14, 100); },
[](){ return sleeper(17, 50); });
std::cout << "wait_first_value_het() => " << result << std::endl;
assert(boost::get< int >( result) == 17);