Ну, почему не вы двигаетесь args...
?
Вы всегда копируете внутри CreateAndDo. Нет никаких причин, и это запрещает вам передавать аргументы только для перемещения, как вы нашли.
Я не вижу, что это имеет какое-либо отношение к шаблонам или пакетам параметров, на самом деле, если только проблема не состоит в том, что неясно, как выполнить перемещение в этой ситуации. Вопрос не в том, как передать unique_ptr
в пакет параметров, а в том, что делать с ним впоследствии, и это то же самое, что и без пакета параметров & mdash; переместите unique_ptr
вокруг.
Вы должны переслать args, что эффективно выполняет перемещение в случае необходимости и копирование в противном случае. Вам также понадобится аргумент для пересылки .
template<typename T, typename... Args>
static bool CreateAndDo(Handler & rHandler, Args&&.. args)
{
auto pT = T::Create(std::forward<Args>(args)...);
rHandler.DoStuff(std::move(pT));
}
Итак, проблема в том, что вы только переместили в одну часть цепочки вызовов функций, но не во вторую часть, что привело к ненужному & mdash; а иногда невозможно & mdash; копия.