función de la cadena mecanismo de llamada (no devolución de llamada)

En general, el código del código cuando habrá una llamadas a funciones continuas, y cada vez que el resultado de la llamada para hacer un juicio. Los siguientes ejemplos:
Definimos la función func_impl(), la llamada función interna func_internal_1(),func_internal_2(),func_internal_3(). Los tres función tiene éxito el valor de retorno son ambos 0, el fracaso tiene un diferentes códigos de error.
Así como una forma general de la escritura se puede escribir de la siguiente manera:

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

Como el anterior, no hay problema funcional, pero el valor de retorno aliento intermedia. Un gran segmento de código independiente de la función de repetición! ! !

Reflexión: Si podemos error de juicio Lite, la cantidad de código caerá mucho!

Después de pensarlo, adoptar las formas siguientes:


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

Como muchos de cantidad de código que hace disminuir, y el uso ||de las propiedades, func_internal_1, func_internal_2, func_internal_3, cualquiera no, serán devueltos directamente. De hecho, en línea con las expectativas, pero la desventaja es que el valor sólo será ret tipo bool, sólo dos valores, 0 y 1. Así que al final sólo se sabe la función tiene éxito o no, sin registro más detallado, no se puede juzgar func_internal_1, func_internal_2, func_internal_3, que funcionan en el final no! ! !

Reflexión de nuevo, en la forma siguiente:

// 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! empujado a este punto utilizando la función de plantilla, podemos lograr, valor RET es igual al fracaso final del valor de retorno de la función, si se define un valor de retorno razonable, entonces saber rápidamente cuando falla la función, el código de error y el fracaso !

Supongo que te gusta

Origin www.cnblogs.com/sinpo828/p/12656793.html
Recomendado
Clasificación