2010-11-10 12 views
13

puedo necesitar reconsiderar mi diseño en general un poco más, pero tal como está, parece que es posible que quiera hacer algo como:¿Se puede usar un boost :: shared_ptr como clave para un mapa?

class A; 
class B; 
std::map<boost::shared_ptr<const A>, B> APtrToBMap; 

He intentado esto, y lo hace parecer que funciona en un caso simple (el compilador no se quejó, y las pruebas simples parecen funcionar). Pero estoy teniendo dudas sobre este enfoque. Sospecho que hay algunos problemas allí que no conozco.

Entonces, ¿es válido lo anterior en un sentido práctico? ¿O hay algún error del que no estoy consciente cuando hago esto?

+1

¿Qué no funciona? –

+1

@Sam, el hecho de que aún no haya descubierto un problema no significa que no lo sea. Creo que es una gran idea preguntar sobre posibles problemas para un uso no estándar como este. –

+0

Gracias a todos por sus respuestas. Como algunos de ustedes señalaron, es principalmente un síntoma de un mal diseño; Estaba tratando de resolver un problema en el lugar equivocado. Desde entonces, he reexaminado mi diseño y no necesitaré hacer el mal mapa sobre el que hice preguntas. Las respuestas sobre por qué esta es una mala idea también fueron realmente esclarecedoras; Sabía en mi instinto que no haría exactamente lo que quería hacer; No podía ver por qué hasta ahora. (De hecho, lo que estaba tratando de hacer no funcionaría con el mapa que he modelado anteriormente) – Taeolas

Respuesta

24

La referencia tiene esto que decir:

template<class T, class U> 
    bool operator<(shared_ptr<T> const & a, shared_ptr<U> const & b); // never throws 

Devuelve: un valor no especificado de tal manera que

  • < operador es un ordenamiento débil estricto como se describe en la sección 25.3 [lib.alg.sorting] del estándar C++;
  • bajo la relación de equivalencia se define por el operador <,! (A < b) & &! (B < a), dos instancias shared_ptr son equivalentes si y sólo si comparten la propiedad o están vacíos.

Throws: nothing.

Notas: Permite que objetos shared_ptr se usen como claves en contenedores asociativos.

+0

Me alegra que hayas encontrado esto. Llegué a la conclusión opuesta basándome en un rápido vistazo al encabezado, pero eso se basó en mi propio análisis defectuoso. –

+0

Mm. ¿Por qué apoyar la comparación de dos punteros distintos? – wilhelmtell

+1

, pero ¿por qué uno querría usar shared_ptr como clave en un contenedor? – davka

0

No estoy 100% familiarizado con el puntero compartido, pero si hay una manera de obtener acceso al puntero original, puede usarlo como la clave (si todavía está preocupado por alguna razón).

+0

Pero entonces el mapa no evitaría que el shared_ptr se destruya a sí mismo. Si pusiera el shared_ptr en el mapa, podría hacer que la única referencia al ptr se encuentre dentro del mapa. –

+0

No entiendo ... solo quiere un mapa del puntero al objeto B, así que le dije que si tiene miedo de usar el ptr compartido por alguna razón, puede usar el puntero. – robev

+0

¿O quiere decir que tener una copia de shared_ptr en el mapa evitará que se elimine el objeto? – robev

4

Sí, puede usar un puntero compartido como la clave para el estándar, pero ese es un signo seguro de diseño roto. Se ordenaría según algunas ubicaciones de memoria aleatorias.

Su pregunta es un poco vaga. Si dices cómo usarías ese mapa y qué estás intentando archivar, es posible que obtengas respuestas más útiles.

+2

Un mapa con un orden aleatorio todavía es útil para la búsqueda rápida de datos que están asociados pero no forman parte del objeto. No saltaría a la conclusión de un diseño roto. –

+0

@Mark ¿Puedes dar un ejemplo? Si la clave del mapa es un puntero, ¿por qué el valor del mapa no es parte del objeto? El efecto es el mismo. –

+0

¿Qué sucede si desea buscar datos basados ​​en un objeto en particular? Lo he usado varias veces para adjuntar datos a elementos en listas de IU y cuando la API no proporcionaba un método razonable para hacerlo. –

0

¡Cuidado si estás usando esto junto con boost :: python! Todas las operaciones en C++ basadas en la comparación de objetos shared_ptr pueden fallar si pasa en esos objetos shared_ptr de Python

Cuestiones relacionadas