c++ traits

c++ - ¿Cómo funcionan las clases de rasgos?



traits (2)

Las clases de rasgos no determinan el tipo de objeto. En su lugar, proporcionan información adicional sobre un tipo, normalmente definiendo typedefs o constantes dentro del rasgo.

Estoy leyendo el eficaz C ++ de Scott Meyers. Está hablando de clases de rasgos, entendí que los necesito para determinar el tipo de objeto durante el tiempo de compilación, pero no puedo entender su explicación sobre lo que realmente hacen estas clases. (Desde el punto de vista técnico)


Quizás estés esperando algún tipo de magia que haga que los rasgos de tipo funcionen. En ese caso, se desilusiona, no hay magia. Los rasgos de tipo se definen manualmente para cada tipo. Por ejemplo, considere iterator_traits , que proporciona typedefs (por ejemplo, value_type ) para iteradores.

Usándolos puedes escribir

iterator_traits<vector<int>::iterator>::value_type x; iterator_traits<int*>::value_type y; // `x` and `y` have type int.

Pero para hacer que esto funcione, en realidad hay una definición explícita en algún lugar del encabezado <iterator> , que lee algo como esto:

template <typename T> struct iterator_traits<T*> { typedef T value_type; // … };

Esta es una especialización parcial del tipo iterator_traits para tipos de la forma T* , es decir, punteros de algún tipo genérico.

En la misma línea, iterator_traits están especializados para otros iteradores, por ejemplo, typename vector<T>::iterator .