Я пишу сетевую библиотеку 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.
Имеет большой смысл, что контекст имеет время жизни, которое соответствует времени жизни самой сопрограммы.
Это означает, что я ожидаю, что он содержит указатель (или reference_wrapper) на фактическое (скрытое) состояние реализации.
Тем не менее, просто делайте так, как делает сама библиотека Boost, то есть взять yield_context
объект по значению.