Как я должен передать boost :: asio :: yield_context в моих собственных функциях?

Я пишу сетевую библиотеку C ++ 11, которая использует Boost.Asio под капотом. Я хочу показать API, который позволяет пользователям использовать сложную сопрограммы. Как я должен принять boost::asio::yield_context параметр в моих функциях API? По значению? По ссылке? По константной ссылке? Я понятия не имею, как дорого эти yield_context объекты для копирования.

Например:

Result remoteProcedureCall(Args args, boost::asio::yieldcontext yield)
//                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ How to pass?

Я знаю, что могу взять универсальную ссылку и сделать идеальную пересылку:

template <typename TYield>
Result remoteProcedureCall(Args args, TYield&& yield)
{
//...
boost::asio::async_write(socket_, buffer, std::forward<TYield>(yield));
//...
}

Но я бы предпочел, чтобы функции моего API не были шаблонными, чтобы я мог реализовать идиому Pimpl.

4

Решение

Имеет большой смысл, что контекст имеет время жизни, которое соответствует времени жизни самой сопрограммы.

Это означает, что я ожидаю, что он содержит указатель (или reference_wrapper) на фактическое (скрытое) состояние реализации.

Тем не менее, просто делайте так, как делает сама библиотека Boost, то есть взять yield_context объект по значению.

5

Другие решения


По вопросам рекламы [email protected]