2013-11-20 1 views
0

나는 아래의 예에서 스위치 케이스에서 제거하려는 :펑터의 배열을 사용하여 스위치 케이스에서 제거하십시오

| 
                 | 
                 ''' ---- (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; 
    } 
} 

:

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: 
       ; 
      } 
    } 

나는 같은 것을 할 싶습니다 스위치 케이스를 없애려면 어떻게해야합니까? (C++ 98에서는 boost를 사용하지 않고)?

답변

1

아무 것도 바인딩 할 필요가 없습니다.

if (checks[i](value, 0)) 

또한 Functor 개체 배열이 필요하지 않습니다. 함수 포인터는 당신이 보여준 논리에 잘 맞습니다. 당신의 checks은 상기와 같은 간단하고 더 상태가없는 경우

bool (*(checks[]))(double, double) = { /* ... */ }; 
1
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; 
    } 
} 

, 당신은 std::function<bool(double,double)>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); 

코드는 테스트를 거치며 이전 테스트가 실패하고 오류가보고 된 경우에만 수행됩니다.

관련 문제