有时在实现某种算法的类中,我希望用户能够启用或禁用某些功能,例如缩放某些输入值。有时我会看到以下代码(在构造函数中设置了bool / float值):
class A
{
private:
bool enableScaling;
float scaleFactor;
public:
float foo(float x) const {
...
if(enableScaling) {
x *= scaleFactor;
}
...
}
};
为此目的,我尚不清楚两个变量,我正在寻找此类情况的建议。
如果是小数位数,我可以完全省略布尔变量并设置默认值scaleFactor = 1.0f
(中性),我想这对我来说还可以。有时“特征参数值”只能为正,因此我可能将其默认值设置为-1以表明该参数已被禁用,但有时情况并非如此(允许所有值)。
对于这种情况,您通常采取什么方法?
答案 0 :(得分:0)
您可以将enableScaling
和scaleFactor
折叠为std::optional<scaleFactor>
。
这是C ++ 17的方式。
在此之前,boost::optional
是一个选择。
在您的特定情况下,将scaleFactor
缺省为1.0f
是一个选项,因为将float
乘以1.0f
必须通过IEEE754保留原始的float
标准(假设您的平台符合该标准)。
答案 1 :(得分:0)
对于这种情况,您通常采取什么方法?
这不能一劳永逸地回答,这取决于具体情况,还可以使用其他选项来更改类的行为等。(正如您已经说过的,整数值-1
可能很有意义表示特殊情况(如果有效范围是正数或非负数)。
但是,您描述了可以用统一的方式处理的常见情况,即,您具有一个确定的值,可以更改类的行为,但前提是该类已设置/存在。在这种情况下,请使用std::optional
(或者,如果您不能使用C ++ 17,则使用boost::optional)存储有问题的值的数据成员。它为您的数据成员添加了一个空状态,准确表达了您要实现的目标:如果有值,请使用它,否则,请不要使用。这更具表现力,因为它记录了您的意图,而不是依赖特定的值。