Я преобразовываю некоторый код из CreateProcess
для использования boost-process .Мне нужно заменить мои CreateProcess
использования на boost::process::child
.Проблема в том, что у меня несовместимые способы сказать «Я хочу использовать значение по умолчанию».То, что раньше было командой из одной строки, превратилось в шестнадцать if
операторов.
Используемая в настоящее время функция работает следующим образом (упрощенно):
void CreateProcess(int, float);
Каждый параметр имеет значение, которое вы можетеиспользуйте, чтобы указать, что вы хотели по умолчанию.В этом примере я буду использовать 0:
int int_param = ...;
float float_param = ...;
CreateProcess(0, 0); //Use both defaults
CreateProcess(int_param, 0); //Use default float
CreateProcess(0, float_param); //Use default int
CreateProcess(int_param, float_param); //No defaults
Это обычный дизайн.Вы знаете, о чем я говорю.Хотел ли я использовать значение по умолчанию или нет, можно было решить с помощью простого условия, такого как (... ? 0 : int_param)
.Это позволило каждому вызову CreateProcess
быть одной строкой кода.
CreateProcess( (... ? 0 : int_param), (... ? 0 : float_param) );
Там, где я раньше звонил CreateProcess
, теперь я хочу создать класс child
.Конструктор для child
работает следующим образом:
template<typename ...Args>
explicit child(Args&&...args);
Вместо того, чтобы передавать конкретное значение для использования по умолчанию, я должен ничего не передавать .
int int_param = ...;
float float_param = ...;
child c; //Use both defaults
child c(int_param); //Use default float
child c(float_param); //Use default int
child c(int_param, float_param); //No defaults
child c(float_param, int_param); //Argument order is irrelevant
Пока что мое единственное «решение» - это использование if
ветвей.
if (...) {
if (...)
child c;
else
child c(float_param);
} else {
if (...)
child c(int_param);
else
child c(int_param, float_param);
}
В этом примере есть только два возможных аргумента, и он становится четырьмя ветвями. Реальное child
имеет четыре возможных аргумента, поэтому у каждого экземпляра есть шестнадцать ветвей.
Мне бы хотелось, чтобы был какой-то способ построения вызова, чтобы избежать этого ветвления.Также подходит решение, специфичное для boost::process
.
К вашему сведению, последние два аргумента для child
могут иметь или не быть одного типа.