Как переместить unique_ptr из пакета параметров внутри метода шаблона - PullRequest
0 голосов
/ 11 января 2019

Я хочу передать пакет параметров в метод шаблона, который создает новый экземпляр объекта типа, указанного в другом аргументе шаблона.

Пример минимального кода :

мой код фактически выполняет больше операций с созданным типом и обработчиком

template<typename T, typename... Args>
static bool CreateAndDo(Handler & rHandler, Args.. args)
{
  auto pT = T::Create(args...);
  rHandler.DoStuff(std::move(pT));
}

Простое использование:

Handler tHander;
// the 0 is just an example of an argument
CreateAndDo<ConcreteType>(tHander, 0);

Теперь моя проблема в том, что одним из моих аргументов является std::unique_ptr.

auto pPtr = std::make_unique<ConcreteArg>();
CreateAndDo<ConcreteType>(tHander, std::move(pPtr));

Это не компилируется, потому что std::unique_ptr должен был бы быть перемещен методом CreateAndDo. Я знаю, что мне нужно продолжать двигать аргументы, но я не знаю, как это сделать с помощью пакета параметров.

Как я мог это сделать?

1 Ответ

0 голосов
/ 11 января 2019

Ну, почему не вы двигаетесь 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; копия.

...