2011-12-30 18 views
14

Según cplusplus.com, la función std::type_info::before() ...¿Para qué sirve `type_info :: before`?

devuelve verdadero si el tipo precede al tipo de lado derecho en el orden de clasificación.
El orden de clasificación es solo un orden interno mantenido por una implementación en particular y no está necesariamente relacionado con las relaciones de herencia o el orden de declaración.

¿Para qué sirve?

Respuesta

24

Considere que quiere poner sus objetos type_info como llaves en un map<type_info*, value>. El type_info no tiene un operator < definido, por lo que debe proporcionar su propio comparador. Lo único que está garantizado para trabajar desde la interfaz type_info es la función before(), ya que ni las direcciones de type_info ni el name() deben ser únicos:

struct compare { 
    bool operator()(const type_info* a, const type_info* b) const { 
     return a->before(*b); 
    } 
}; 

std::map<const type_info*, std::string, compare> m; 

void f() { 
    m[&typeid(int)] = "Hello world"; 
} 
+1

"* El' type_info' no tiene un 'operador <' definido, por lo que debe proporcionar su propio comparador. * "' Std :: less <> '(' std :: map <> 'default comparitor) funciona para ** todos los punteros **, solo obtiene el ordenamiento de direcciones en lugar del orden de colación. – ildjarn

+6

@ildjarn: malinterpretas el problema. El estándar no garantiza que exista a lo sumo un 'type_info' por tipo. De hecho, es común encontrar * más de una 'typeinfo' * creada para el mismo tipo. El caso más trivial está en el contexto de las bibliotecas vinculadas dinámicamente, como dijo Dietmar. – ybungalobill

+1

@ildjarn Vuelve a leer tu presupuesto. Habla sobre 'operator <' de 'type_info', pero usted discute sobre la validez de comparar punteros con' type_info', lo que implica que la oración citada es de alguna manera incorrecta. Pero no lo es, porque no dije nada sobre la comparación de punteros. Entonces, ¿por qué escribes comentarios irrelevantes? – ybungalobill

1

Da un pedido.

Esto es obligatorio si desea almacenar valores en algunos contenedores, como std :: map.

4

Esto es útil para definir un orden de objetos, por ejemplo TypeInfo para ponerlos en un std :: map. La siguiente pregunta obvia es: ¿por qué no se escribe el operador <()? No sé la respuesta a esta pregunta.

+2

"* La pregunta de seguimiento obvia es: ¿por qué no se escribe el operador <()? *" ¿Cómo se podría definir un 'operador <' para un tipo de puntero? – ildjarn

+0

'type_info' no tiene un constructor de copia ni un operador de asignación de copias, por lo que no se puede almacenar directamente en un contenedor. Y, por supuesto, el tipo de clave de un contenedor asociativo no puede ser una referencia, por lo que la única opción restante es almacenar un 'type_info *', para el cual no se puede suministrar un 'operador <'. Posiblemente lo más sensato es especializar 'std :: less '. – ildjarn

+1

@ildjarn: la pregunta de Dietmar es 'por qué 'type_info' tiene' before() 'pero no' operator <''.Aunque lo que dices es correcto, no responde a su pregunta. P.ej. ¿Por qué no puedo escribir 'typeid (int) ybungalobill

1

Piense en ello como un operador menor que (<) para objetos type_info. Si alguna vez quiso almacenar en una colección ordenada, como un conjunto de mapas, puede usarla para hacer un comparador adecuado. Es una forma confiable y preferida, en lugar de, digamos, usar el nombre del tipo que podría no ser exclusivo.