C++ 使用布尔变量和值启用功能

C++ 使用布尔变量和值启用功能,c++,oop,architecture,C++,Oop,Architecture,有时,在实现某种算法的类中,我希望用户能够启用或禁用某些功能,比如缩放某些输入值。有时我会看到以下代码(构造函数中设置了bool/float值): 这方面的两个变量对我来说并不清楚,我正在寻找针对这种情况的建议 在缩放的情况下,我可以完全忽略布尔变量并设置默认值scaleFactor=1.0f(中性),我想这对我来说是可以的。有时“feature parameter value”只能是正值,因此我可能会将其默认值设置为-1,以显示此值已禁用,但有时情况并非如此(所有值都允许) 对于这种情况,您通

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

这方面的两个变量对我来说并不清楚,我正在寻找针对这种情况的建议

在缩放的情况下,我可以完全忽略布尔变量并设置默认值
scaleFactor=1.0f
(中性),我想这对我来说是可以的。有时“feature parameter value”只能是正值,因此我可能会将其默认值设置为-1,以显示此值已禁用,但有时情况并非如此(所有值都允许)


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

您可以将
启用缩放
缩放因子
折叠为
标准::可选

这是C++17的方式

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


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

您可以将
启用缩放
缩放因子
折叠到
std::optional

这是C++17的方式

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

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

一般来说,您对此类情况的处理方法是什么

这不能一劳永逸地回答,这取决于环境、可能的其他选项(如您所说,如果有效范围为正或非负,则整数值
-1
可能表示特殊情况)

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

一般来说,您对此类情况的处理方法是什么

这不能一劳永逸地回答,这取决于环境、可能的其他选项(如您所说,如果有效范围为正或非负,则整数值
-1
可能表示特殊情况)


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

如果您没有
启用scaling
变量,则必须始终执行乘法。甚至当
scaleFactor
等于
1.0
时,编译器也无法知道它,因此无法优化它。检查布尔变量几乎总是比启用/禁用任何操作更有效。更不用说可选处理并不总是这么简单,所以可能没有任何可能的默认值可以使用。也许更多关于主题的内容在中。是的,@FranklinYu不确定,如果您没有
enableScaling
变量,则必须始终执行乘法。甚至当
scaleFactor
等于
1.0
时,编译器也无法知道它,因此无法优化它。检查布尔变量几乎总是比启用/禁用任何操作更有效。更不用说可选处理并不总是这么简单,所以可能没有任何可能的默认值可供使用。也许更多关于主题的内容在中。是的,@FranklinYu不确定
class A
{
private:
  bool enableScaling;
  float scaleFactor;

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

    if(enableScaling) {
      x *= scaleFactor;
    }

    ...
  }
};