Sígueme en los capítulos intermedios de C++: la ingeniosa aplicación de los puntos suspensivos

1. Expresiones de coma y orden de evaluación

¿Por qué analizar la expresión coma? La razón principal es que esta aplicación se está volviendo cada vez más frecuente después de c++11, y el orden de evaluación suele tener algunos códigos extraños en las aplicaciones prácticas. Es precisamente porque el orden de evaluación controla el resultado final. El orden de las operaciones de comas es de izquierda a derecha, la última es el valor final, el orden de las operaciones de signos iguales es asociativo a la derecha, es decir, de derecha a izquierda. Sabiendo esto, puede usar algunas técnicas para lograr el objetivo en las siguientes expresiones plegables y aplicaciones de parámetros variables relacionadas.
Hay un problema aquí, asegúrese de aclarar el orden de evaluación y la precedencia de los operadores, y no los mezcle. Si no tiene clara la prioridad, eche un vistazo a los libros y materiales relevantes, y el orden de evaluación puede consultar el siguiente sitio web:
https://zh.cppreference.com/w/cpp/language/eval_order

2. Puntos suspensivos (…) y expresiones plegables

¿Cuál es el uso de estos puntos suspensivos, es decir, tres puntos, en C++?Aquí hay un resumen:
1. Función de parámetro variable
Esto es desde la función printf() inicial hasta el tamaño posterior de ... (). Hay algunos requisitos para usar estas funciones, como que los puntos suspensivos deben estar al final y que se debe acceder a los parámetros secuencialmente. De hecho, todos pueden entender que funciones como printf en realidad se implementan usando macros como va_arg, va_start, va_end y va_list. Si desea implementar una función variable propia, puede usar estas macros para probarla. Hay muchos ejemplos listos para usar en línea y en libros.

2. Use plantillas de parámetros variables después de c ++ 11.
Esto se introdujo en los artículos anteriores, como la parametrización de variables de plantilla, por lo que no entraré en detalles aquí. Generalmente algo como esto:

template<typename... T> class Name;  

3. Plantilla de función de parámetro variable
Esto también se detalla en el frente, y hay ejemplos muy detallados en "Parametrización de variable de plantilla en C++ 11". Puedes buscar el BLOG anterior.

template <typename...  T>
void TestVarTemplate(T... args)
{
    std::cout<< "args len is:"<< sizeof...(args) << std::endl;
}

4. Expresión de plegado
Esta ha sido especialmente analizada al frente. Similar a:

template<typename... T>
auto Sum (T... args)
{
    return (... + args);
}

5. Parámetros de variables de macros
Como se mencionó en la metaprogramación anterior, algunas macros solo admiten parámetros de variables, similares a:

#define CHECK1(x, ...) if (!(x)) { printf(__VA_ARGS__); }

VA_ARGS puede reemplazar argumentos dentro de puntos suspensivos, incluidas las comas entre ellos.

6. Captura de excepciones
Por ejemplo, utilice puntos suspensivos en try catch(...) para capturar la última excepción.

Aquí nos centramos en la aplicación de los puntos suspensivos en la expresión de plegado, a la que hay que prestar atención.

3. Aplicación

1. Aplicación de parámetro de variable (plantilla de parámetro de variable, parámetro de variable de función, parámetro de variable de macro)
Este es un ejemplo de la expresión de coma anterior:

template < typename T>
int Add(T arg)
{
    return    arg;
}

template < typename... Args>
int AddValue(Args ... args)
{
    //也可使用类似int v[] = { (Add(args),0)... };这种逗号表达式代码,只是强制存储0到V数组中
    int v[] = { Add(args)... };
    int d = 0;

    for (auto n : v)
    {
        d += n;
    }

    return    d;
}

int TestAdd()
{
    std::cout << "-----"<< AddValue(3, 3, 3) << std::endl;;
    return 0;
}
int main()
{
    TestAdd();
    system("pause");

    return 0;
}

2. Aplicación en expresiones plegables
Aquí, (... =) se usa en combinación con el orden de evaluación mencionado anteriormente para realizar la generación inversa de una matriz vectorial:

#include <vector>

template<class ...Args>
auto Rorder(Args&&... args) {
    std::vector<std::common_type_t<Args...>>vec {};
    bool bOk = false;
    (bOk = ... = (vec.push_back(args), false));

    return vec;
}
int main()
{
    std::vector<int> vec = Rorder(1, 2, 3, 4, 5, 6);
}

Cuatro Resumen

El enfoque de este artículo es revisar y resumir, y formar algunos puntos de conocimiento dispersos en un punto de conocimiento combinado. El punto es usar los puntos suspensivos en parámetros variables para concatenar expresiones plegables y secuencias de evaluación para formar un mayor nivel de comprensión general, en lugar de cortar el conocimiento de forma vertical y clara. Al tejerlos horizontalmente, se forma una estructura de red de conocimiento, que es más fácil de entender y profundizar la impresión.

Supongo que te gusta

Origin blog.csdn.net/fpcc/article/details/131353267
Recomendado
Clasificación