Необязательный аргумент шаблонного метода - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть код, который создает объекты. Каждый объект может состоять из любого количества модулей и, при желании, конфигурации. Чтобы покрыть оба случая, мне пришлось создать два метода (ниже приведен код «сценария»).

template <typename Impl, typename ... Modules>
Impl create(Ioc& ioc)
{
    return Impl{ioc.create<Modules>()...};
}

Чтобы добавить дополнительную конфигурацию, нужно написать другую версию

template <typename Impl, typename Config, typename ... Modules>
Impl create(Ioc& ioc, const Config& config)
{
    return Impl{ioc.create<Modules>()..., config};
}

Is Можно ли как-то создать один метод, который будет охватывать оба случая?

1 Ответ

2 голосов
/ 10 апреля 2020

Вы можете использовать несколько пакетов параметров, если вы поставили Конфиг последним:

template <typename Impl, typename... Modules, typename... Config>
Impl create(Ioc& ioc, Config const& ... config) {
  return Impl{ioc.create<Modules>()..., config ...};
}

Вы также можете разделить пакеты параметров с помощью лямбды:

template <typename Impl, typename ... Modules>
auto create = [](Ioc& ioc, auto const& ... config) -> Impl {
    return Impl{ioc.create<Modules>()..., config ...};
};

Это будет принимать любое число параметров после первого Config. Чтобы ввести только ноль в один дополнительный аргумент, добавьте

static_assert(sizeof...(config) <= 1);
...