我正在将一些代码从 using 转换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);
而不是传递一个特定的值来使用默认值,我必须传递 nothing。
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
可能是也可能不是同一类型。