체인 함수 호출 메커니즘 (비 콜백)

일반적으로, 코드의 코드가 연속 함수 호출, 때마다 판단을 할 수있는 호출의 결과가있을 것입니다 때. 다음 예는 :
우리는 함수를 정의 func_impl(), 내부 함수 호출을 func_internal_1(),func_internal_2(),func_internal_3(). 세 함수의 리턴 값이 모두 0이 고장이 다른 에러 코드를 가지고있다 성공.
다음과 같이 서면의 일반적인 방법을 쓸 수 :

void func_impl()
{
    int ret;

    ret = func_internal_1();
    if (ret)
    {
        std::cout<< "some error"<<std::endl;
        return ret;
    }

    ret = func_internal_2();
    if (ret)
    {
        std::cout<< "some error"<<std::endl;
        return ret;
    }

    ret = func_internal_3();
    if (ret)
    {
        std::cout<< "some error"<<std::endl;
        return ret;
    }
    return 0;
}

위의 기능적인 문제가 있지만, 반환 값 중간 숨이 찬으로. 반복 기능 독립적 인 코드의 큰 부분! ! !

반사 : 우리는 라이트를 잘못 판단 할 수있는 경우, 코드의 양이 많이 떨어질 것이다!

몇 가지 생각 후, 다음과 같은 형태를 취할 :


void func_impl()
{
    int ret;

    ret = func_internal_1() ||
          func_internal_2() ||
          func_internal_3();
    if (ret)
        std::cout<< "some error"<<std::endl;
    return ret;
}

많은 코드의 양이 감소하고, 사용 않는 ||속성, func_internal_1, func_internal_2, func_internal_3의를, 하나라도 실패, 직접 반환됩니다. 사실 기대와 일치하지만, 단점은 값은 RET 부울 유형, 두 값, 0과 1이 될 것입니다. 그래서 결국 우리가 기능 만 더 자세한 로그없이, 여부 성공을 알고, 당신은 실패 결국 기능 func_internal_1, func_internal_2, func_internal_3를 판단 할 수 있습니다! ! !

다음과 같은 형태로 다시 반사 :

// define anyone template function
template <typename T>
auto anyone(T arg) -> decltype(arg)
{
    return arg;
}

template <typename T, typename... Args>
auto anyone(T arg, Args... args) -> decltype(arg)
{
    return arg ? arg : anyone(args...);
}

void func_impl()
{
    int ret;

    ret = anyone(func_internal_1(),
                 func_internal_2(),
                 func_internal_3());
    if (ret)
        std::cout<< "some error"<<std::endl;
    return ret;
}

합리적인 반환 값이 정의되어있는 경우 함수가 실패 곳 OK! 템플릿 기능을 사용하여이 점에 밀어, 우리는 RET 값이 함수의 반환 값의 궁극적 인 실패와 동일, 달성 할 수있는, 신속하게, 오류 코드와 실패를 알고 !

추천

출처www.cnblogs.com/sinpo828/p/12656793.html