Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

when_any, return value

Boost , Chapter 1. Fiber , when_any

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Полезнее добавить возможность улавливания возвращаемого значения с первой из выполняемых функций задачи. Опять же, мы предполагаем, что никто не будет делать исключения.

Одной из тактик является адаптация нашего класса<Done>для хранения первого из значений возврата, а не простого<bool>. Вместо этого мы используем.<unbounded_channel<>>. Нам нужно только заложить первое значение, поэтому мы<unbounded_channel::close()>Как только мы получим это значение. Последующие<push()>звонки вернутся<closed>.

// Assume that all passed functions have the same return type. The return type
// of wait_first_value() is the return type of the first passed function. It is
// simply invalid to pass NO functions.
template< typename Fn, typename ... Fns >
typename std::result_of< Fn() >::type
wait_first_value( Fn && function, Fns && ... functions) {
    typedef typename std::result_of< Fn() >::type return_t;
    typedef boost::fibers::unbounded_channel< return_t > channel_t;
    auto channelp( std::make_shared< channel_t >() );
    // launch all the relevant fibers
    wait_first_value_impl< return_t >( channelp,
                                       std::forward< Fn >( function),
                                       std::forward< Fns >( functions) ... );
    // retrieve the first value
    return_t value( channelp->value_pop() );
    // close the channel: no subsequent push() has to succeed
    channelp->close();
    return value;
}

Мясо функции<wait_first_value_impl()>, как вы могли бы ожидать:

template< typename T, typename Fn >
void wait_first_value_impl( std::shared_ptr< boost::fibers::unbounded_channel< T > > channel,
                            Fn && function) {
    boost::fibers::fiber( [channel, function](){
                              // Ignore channel_op_status returned by push():
                              // might be closed; we simply don't care.
                              channel->push( function() );
                          }).detach();
}

Он называет пройденную функцию, толкает ее обратное значение и игнорирует результат<push()>. Вы можете назвать это так:

std::string result = wait_first_value(
        [](){ return sleeper("wfv_third",  150); },
        [](){ return sleeper("wfv_second", 100); },
        [](){ return sleeper("wfv_first",   50); });
std::cout << "wait_first_value() => " << result << std::endl;
assert(result == "wfv_first");


PrevUpHomeNext

Статья when_any, return value раздела Chapter 1. Fiber when_any может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: when_any ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 07:27:21/0.0036869049072266/0