2011-01-27 11 views
5

Existe, dentro de la biblioteca estándar o Boost, algún tipo de clase base de utilidad para rellenar una secuencia compatible con STL personalizada con los tipos necesariosde tipo (tipo_edad, tipo_valor, etc.). Estoy pensando en algo como boost::iterator_facade, pero para contenedores.Tipos de letra estándar para contenedor compatible con STL

Iba a enrollar el mío, pero quería asegurarme de que tal cosa no existiera.

ACTUALIZACIÓN:

Ésta es la clase base la utilidad que se me ocurrió, en caso de que alguien le resulta útil:

template <class C> 
class ContainerAdapter 
{ 
public: 
    typedef C::value_type value_type; 
    typedef C::reference reference; 
    typedef C::const_reference const_reference; 
    typedef C::const_iterator iterator; 
    typedef C::const_iterator const_iterator; 
    typedef C::difference_type difference_type; 
    typedef C::size_type size_type; 

protected: 
    typedef C::container_type; 
}; 


// Usage 
class MyCustomContainer : public ContainerAdapter< std::vector<int> > 
{ 
... 
}; 

ContainerAdapter simplemente "ecos" los typedefs anidados de contenedor subyacente de un contenedor personalizado. No hay nada para eso, realmente.

+0

La gente usa value_type e iterator porque es más fácil que las alternativas, pero normalmente uso value_type & en lugar de referencia, por ejemplo (y el vector es malo). ¿Estás seguro de que proporcionar esos otros tipos de archivos anidados es una ventaja para ti? Normalmente paso los elementos a las funciones donde estarán ligados como un const y de todos modos, y esa referencia de referencias anidadas typedef nunca se toca. –

+0

@Fred: solo me preocupa que mi contenedor sea compatible con cosas como BOOST_FOREACH, rangos de impulso, std :: back_insertion_iterator, etc. Si solo necesito proporcionar un subconjunto mínimo de todos los typedefs, me gustaría saber cual. Supongo que es bastante fácil experimentar y descubrir. –

+0

Es cierto, pero las utilidades generales generalmente se escriben para ser agnósticas; 0x auto es genial para eso. :) –

Respuesta

1

aunque exista, todavía tiene que typedef typename base::size_type size_type. parece que no ganarías mucho.

+0

Solo necesita volver a escribirdef en la clase derivada si desea que los typedefs sean visibles dentro de la declaración de clase. Los usuarios del contenedor personalizado seguirían viendo todos los typedefs heredados de la clase base. Así es como funciona 'boost :: iterator_facade'. –

+0

@Emilie Lo sé, pero suponiendo que para los contenedores tienes que proporcionar operadores y otras cosas que utilizarán esos tipos. – Anycorn

+0

@aaa: siempre puedo usar 'T',' T & ',' const T & ', etc. Los únicos typedefs que realmente necesito (dentro de la declaración) son' iterator' y 'const_iterator'. Sin embargo, admito que tener 'reference',' value_type', etc. en las declaraciones de función del miembro es más bonito desde el punto de vista de la documentación. –

Cuestiones relacionadas