通过布尔变量和值启用功能

时间:2019-02-13 11:39:30

标签: c++ oop architecture

有时在实现某种算法的类中,我希望用户能够启用或禁用某些功能,例如缩放某些输入值。有时我会看到以下代码(在构造函数中设置了bool / float值):

class A
{
private:
  bool enableScaling;
  float scaleFactor;

public:
  float foo(float x) const {
    ...

    if(enableScaling) {
      x *= scaleFactor;
    }

    ...
  }
};

为此目的,我尚不清楚两个变量,我正在寻找此类情况的建议。

如果是小数位数,我可以完全省略布尔变量并设置默认值scaleFactor = 1.0f(中性),我想这对我来说还可以。有时“特征参数值”只能为正,因此我可能将其默认值设置为-1以表明该参数已被禁用,但有时情况并非如此(允许所有值)。

对于这种情况,您通常采取什么方法?

2 个答案:

答案 0 :(得分:0)

您可以将enableScalingscaleFactor折叠为std::optional<scaleFactor>

这是C ++ 17的方式。

在此之前,boost::optional是一个选择。

在您的特定情况下,将scaleFactor缺省为1.0f是一个选项,因为将float乘以1.0f必须通过IEEE754保留原始的float标准(假设您的平台符合该标准)。

答案 1 :(得分:0)

  

对于这种情况,您通常采取什么方法?

这不能一劳永逸地回答,这取决于具体情况,还可以使用其他选项来更改类的行为等。(正如您已经说过的,整数值-1可能很有意义表示特殊情况(如果有效范围是正数或非负数)。

但是,您描述了可以用统一的方式处理的常见情况,即,您具有一个确定的值,可以更改类的行为,但前提是该类已设置/存在。在这种情况下,请使用std::optional(或者,如果您不能使用C ++ 17,则使用boost::optional)存储有问题的值的数据成员。它为您的数据成员添加了一个空状态,准确表达了您要实现的目标:如果有值,请使用它,否则,请不要使用。这更具表现力,因为它记录了您的意图,而不是依赖特定的值。