通过使用函子数组来摆脱开关情况
Get rid from switch case by using array of functors
我想去掉下面例子中的开关情况:
for ( int i = 0; i < 7; ++i )
{
switch (i)
{
case 2: case 5: case 6:
if (value < 0)
{
reportError(param);
return;
}
break;
case 3: case 4:
if (value <= 0)
{
reportError(param);
return;
}
break;
default:
;
}
}
我想做这样的事情:
|
|
''' ---- (error)
'
std::binary_function<double, double, bool> checks[] = { 0, less_equal<double>(),
less<double>(), less<double>(),
less_equal<double>(),
less_equal<double>(),
0 } ;
for(int i = 0; i < 7; ++i)
{
if( bind2nd(checks[i], 0)(value) ) <----- error
{
reportError(param);
return;
}
}
如何摆脱开关情况(在C++98中,不使用boost)?
您不需要绑定任何内容。
if (checks[i](value, 0))
您也不需要函子对象的数组。函数指针对于您所展示的逻辑来说是很好的。
bool (*(checks[]))(double, double) = { /* ... */ };
auto always_false = [](double, double) {return false;}
std::function<bool(double,double)> checks = {
always_false,
less_equal<double>(),
less<double>(), less<double>(),
less_equal<double>(), less_equal<double>(),
always_false
};
for( int i = 0; i < 7; ++i )
{
if (checks[i]( 0, value ))
{
reportError(param);
return;
}
}
如果你的checks
和上面一样简单,并且没有状态,你可以用bool(*)(double, double)
(一个原始函数指针)代替std::function<bool(double,double)>
。它的效率不会降低。
另一种解决方法是进行面向错误的编程。
boost::optional<ErrorMessage> err;
if (!err && test_1()) err = makeError(param);
if (!err && test_2()) err = makeError(param);
if (!err && test_3()) err = makeError(param);
// ...
if (err)
reportError(*err);
其中代码在测试中流动,并且只有在前一个测试失败并报告错误时才执行某些操作。
相关文章:
- 在 c++ 中在开关情况下使用和不使用"break"时的不同输出
- C++ 模板类:运行时给出的模板参数,如何避免重复大开关情况?
- 如果在开关情况下不匹配,为什么此函数返回 ASCII 值?
- 在开关情况下返回布尔值
- 状态机与开关情况
- 开关情况不起作用
- C :嵌套开关情况
- 如何在开关情况下消除对goto的使用
- 在开关情况下可以默认返回 cin
- 在不包括C++的开关情况下使用范围
- C :在开关情况下进行循环
- C++如何对开关情况进行异常处理
- 为什么编译器不允许我在开关情况下使用变量?
- 通过使用函子数组来摆脱开关情况
- 如果我们在需要整数的开关情况下输入字符会发生什么
- 开关情况下的字符和 int 有什么区别?
- 初始化各种开关情况下的变量
- 从C++中的开关情况返回二维数组
- 如何在开关情况下使用多个值
- 寻找一个宏添加两个字符在一起的开关情况