Вопрос о предописании повышения C++

Я провожу некоторое время, исследуя boost:: архитектуре библиотек и было интересно со следующим фактом:

В некоторых частях библиотек a yyy_fwd.hpp идея используется довольно распространенная (см. boost/detail или boost/flyweight для примеров).

Эти файлы, очевидно, содержат только предописания некоторых основанных на шаблоне классов и насколько я понимаю, мог извлечь выгоду с точки зрения времени компиляции.

Кто-то мог указать, в каких случаях они помогают, и я должен использовать ту же идею при разработке моих собственных шаблонов?

Спасибо.

10
задан kennytm 5 August 2010 в 12:44
поделиться

2 ответа

Прямые объявления нужны для уменьшения зависимостей во время компиляции. Например, при реализации идиомы Pimpl.

Еще один случай: например, boost::pool* зависит от windows.h на платформе Windows. При создании своего интерфейса я не хочу заставлять пользователей моего класса включать системные заголовки, используя свой интерфейс.


*Ладно, это плохой пример, потому что boost/poolfwd.hpp все еще включает windows.h, но я надеюсь, что они исправят эту проблему. И я надеюсь, что вы поняли идею.

3
ответ дан 4 December 2019 в 03:37
поделиться

Я не знаю о 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;
}
2
ответ дан 4 December 2019 в 03:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: