¿Cómo logra la biblioteca STL de C ++ la distinción de tipos?

1. Antecedentes del problema

A veces escribimos una clase de plantilla general. En el proceso de implementación, necesitamos los tipos de parámetros de plantilla y realizamos las operaciones de algoritmo correspondientes según el tipo. Por ejemplo, el avance de la herramienta del algoritmo de compensación del iterador de la biblioteca STL mueve un iterador una distancia determinada, y su firma de función de plantilla es la siguiente:

template<typename IterT, typename DistT>
void advance(IterT& iter, DistT d);

Permítanme hablar sobre los tipos de iteradores en la biblioteca STL. Hay 5 tipos de iteradores de entrada, salida, avance, bidireccional, acceso aleatorio). El método paso a paso de estos iteradores, es decir, el algoritmo de operación es diferente.

1. Iterador de tipo de entrada (entrada): solo puede leer los elementos hacia adelante uno a la vez y devolver los valores de los elementos uno por uno en este orden. El cliente solo puede leer el objeto al que se refiere, no escribir, y solo puede leerlo una vez. Es decir, iteradores creados solo para operaciones de lectura.

2. Iterador de tipo de salida (Salida): A diferencia del iterador de entrada, solo puede avanzar y el cliente solo puede escribir a qué se refiere, y solo una vez. Es decir, iteradores creados solo para operaciones de escritura.

3. Forward Iterator (forward): Puede realizar operaciones de lectura y escritura en un intervalo correcto, tiene las características de Input Iterator y Output Iterator, así como la capacidad de iterar elementos hacia adelante en un solo paso.

4. Bidireccional: sobre la base de Forward Iterator, proporciona la capacidad de iterar elementos hacia atrás en un solo paso.

5. Acceso aleatorio: Tiene todas las funciones del iterador anterior y puede realizar cálculos aritméticos como punteros.

Advance quiere implementar este tipo de operaciones de compensación de iteradores, ¿cómo reconoce estos tipos de iteradores? Después de todo, desde la perspectiva de los parámetros de la plantilla, es imposible identificar qué tipo de iterador es IterT. Entonces, ¿cómo lo hace la biblioteca STL?

2. Escriba la etiqueta (etiqueta)

Sabemos que para identificar ciertas cosas, uno de nuestros métodos es darle a las cosas una marca diferente a otras cosas. C ++ admite tipos vacíos, como struct Dummy {} ;, que tiene atributos de clase únicos. Por lo tanto, usar la característica de tipo vacío y heredar la característica is-a puede dar una etiqueta única a una determinada clase. Este tipo de etiqueta se denomina estructura de etiqueta, que puede entenderse como una identificación de identidad. El sistema compuesto por estas etiquetas puede denominarse sistema de tipos.

C ++ STL proporciona cinco tipos correspondientes de etiquetas para los tipos de iterador en los 5 anteriores:

struct input_iterator_tag {};
struct output_iterator_tag {};
struct forward_iterator_tag : input_iterator_tag {};
struct bidirectional_iterator_tag : forward_iterator_tag {};
struct random_access_iterator_tag : bidirectional_iterator_tag {};

Por lo tanto, utilizando la tecnología de extracción de tipos (rasgos) proporcionada por C ++, estos cinco tipos de iteradores se pueden identificar y el algoritmo de desplazamiento de iterador correspondiente se puede implementar de acuerdo con los diferentes tipos.

Supongo que te gusta

Origin blog.csdn.net/xunye_dream/article/details/114778113
Recomendado
Clasificación