2010-08-05 19 views
10

me paso algún tiempo examinando boost:: bibliotecas arquitectura y estaba interesado en el siguiente hecho:C++ pregunta impulso declaración adelantada

En algunas partes de las bibliotecas una idea yyy_fwd.hpp se utiliza bastante común (véase boost/detail o boost/flyweight para ejemplos).

Estos archivos obviamente solo contienen declaraciones directas de algunas clases basadas en plantillas y, por lo que yo entiendo, podrían beneficiarse en términos de tiempo de compilación.

¿Podría alguien señalar en qué casos ayudan y debería usar la misma idea al diseñar mis propias plantillas?

Gracias.

Respuesta

3

Las declaraciones de reenvío son necesarias para reducir las dependencias en tiempo de compilación. Por ejemplo, al implementar el modismo Pimpl.

Uno de los casos más es que, por ejemplo, boost::pool* depende de windows.h en la plataforma Windows. Al crear mi interfaz, no quiero obligar a los usuarios de mi clase a incluir los encabezados del sistema utilizando mi interfaz.


* Ok, eso es un mal ejemplo, porque todavía incluye boost/poolfwd.hppwindows.h, pero espero que van a solucionar este problema. Y espero que entiendas la idea.

+0

+1 para el buen ejemplo malo :-) –

2

No sé sobre boost, pero estas declaraciones hacia adelante también existen en la biblioteca estándar. Por ejemplo, <iosfwd> contiene declaraciones avanzadas para transmisiones (que son plantillas, normalmente ocultas detrás de typedefs).

Usted se beneficiará de este encabezado, al declarar un operador sobrecargado < <.

En su cabecera:

#include <iosfwd> 

class X { ... }; 

std::ostream& operator<< (std::ostream& os, const X& x); 

Tenga en cuenta que la cabecera no requiere la definición completa de ostream (= basic_ostream<char, char_traits<char> >).

El motivo para el encabezado es que esas plantillas son engorrosas para enviarse declarar. Para el ejemplo anterior, se vería algo así como:

namespace std { 
    template <class CharT> 
    class char_traits; 

    template <class CharT, class CharTraits> 
    class basic_ostream; 

    typedef basic_ostream<char, char_traits<char> > ostream; 
}