Я провожу некоторое время, исследуя boost::
архитектуре библиотек и было интересно со следующим фактом:
В некоторых частях библиотек a yyy_fwd.hpp
идея используется довольно распространенная (см. boost/detail
или boost/flyweight
для примеров).
Эти файлы, очевидно, содержат только предописания некоторых основанных на шаблоне классов и насколько я понимаю, мог извлечь выгоду с точки зрения времени компиляции.
Кто-то мог указать, в каких случаях они помогают, и я должен использовать ту же идею при разработке моих собственных шаблонов?
Спасибо.
Прямые объявления нужны для уменьшения зависимостей во время компиляции. Например, при реализации идиомы Pimpl.
Еще один случай: например, boost::pool
* зависит от windows.h
на платформе Windows. При создании своего интерфейса я не хочу заставлять пользователей моего класса включать системные заголовки, используя свой интерфейс.
*Ладно, это плохой пример, потому что boost/poolfwd.hpp
все еще включает windows.h
, но я надеюсь, что они исправят эту проблему. И я надеюсь, что вы поняли идею.
Я не знаю о boost, но эти прямые объявления также существуют в стандартной библиотеке. Например,
содержит прямые объявления для потоков (которые являются шаблонами, обычно скрытыми за типовыми определениями).
Вы могли бы воспользоваться этим заголовком при объявлении перегруженного оператора<<.
В вашем заголовке:
#include <iosfwd>
class X { ... };
std::ostream& operator<< (std::ostream& os, const X& x);
Обратите внимание, что заголовок не требует полного определения ostream
(= basic_ostream
).
Смысл заголовка в том, что эти шаблоны громоздко объявлять самостоятельно. Для приведенного выше примера это будет выглядеть примерно так:
namespace std {
template <class CharT>
class char_traits;
template <class CharT, class CharTraits>
class basic_ostream;
typedef basic_ostream<char, char_traits<char> > ostream;
}