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