У меня есть функция библиотеки (не под моим контролем здесь), которые принимают ссылку г значение на движимое и Copyable типа Bar:запускает копию в качестве входных данных для функции принятия RValue ссылки
void foo(Bar&& b);
В моем собственном коде я иногда нужно дать ему копию существующего значения, такие как
const auto b = getBar();
foo(mk_copy(b));
b.baz();
Это то, что приходит на ум,
template<typename T> auto mk_copy(T val){return val;}
Есть ли стандартный способ сделать это, или более распространенный шаблон? Может быть, даже
template<typename T> auto mk_copy(T&& val){return std::forward<T>(val);}
Или, как pscill указывает только писать имя класса снова,
foo(Bar(b));
, но я предпочитаю не повторять имена типов.
Как насчет просто вызова конструктора копирования? 'foo (Bar {b});' – pschill
'make_copy' кажется самым чистым. Префикс 'make', похоже, уже собирается стать конвенцией для такого рода вещей. –
Почему вы не можете просто написать перегрузку 'foo' для lvalues в том же пространстве имен, что и реальная функция библиотеки (которая внутренне копирует и перемещается к реальной функции), так что код вызова может выглядеть совершенно естественным без' mk_copy' шум? – ildjarn