2012-02-19 7 views
7

El impulso ptr_list documentation indica que el contenedor utiliza un std::list<void*> subyacente.¿Por qué boost :: ptr_list usa el vacío subyacente *?

¿Por qué usan este tipo en lugar de uno más especializado std::list<T*>?

+0

Es difícil de decir, ya que no tengo idea sobre el impulso. Pero la conexión que puedo ver es nula * puede escribirse en cualquier tipo, por lo que puede hacer que sea similar a T * cuando estás hablando. Cualquier forma esperaría ansiosamente las respuestas de otros miembros respetados de nuestra sociedad – Invictus

Respuesta

8

Probablemente sea necesario reducir el número de instancias de plantilla. Si usa un std::list<T*>, entonces cada uso de ptr_list<T> también crearía una instancia de std::list<T*>. Eso es un montón de instancias si usa ptr_list mucho.

+0

Tiene sentido. Parece un poco hacky. –

3

Esto hace que sea fácil compartir casi todo el código independientemente de los tipos sobre los que se crea una instancia. Casi todo el código está en el único std::list<void *>. Cada instanciación solo agrega código para emitir entre T * y void * cuando sea necesario.

Por supuesto, los compiladores/enlazadores modernos pueden hacer una buena cantidad de esto sin dicha ayuda, pero ese no siempre ha sido el caso (y algunas personas aún usan cadenas de herramientas antiguas, por diversas razones).

+0

Realmente no entiendo lo que quiere decir: boost :: ptr_list y std :: list son plantillas, por lo que deberían funcionar independientemente del tipo subyacente que sea, isn ' ¿Es eso? ¿Por qué se requeriría usar void *? –

Cuestiones relacionadas