C ++ повышает вопрос о форвардной декларации - PullRequest
10 голосов
/ 05 августа 2010

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

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

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

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

Спасибо.

Ответы [ 2 ]

3 голосов
/ 05 августа 2010

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

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


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

2 голосов
/ 05 августа 2010

Я не знаю о повышении, но эти предварительные объявления также существуют в стандартной библиотеке.Например, <iosfwd> содержит прямые объявления для потоков (которые являются шаблонами, обычно скрытыми за typedefs).

Этот заголовок полезен при объявлении перегруженного оператора <<. </p>

В вашем заголовке:

#include <iosfwd>

class X { ... };

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

Обратите внимание, что заголовок не требует полного определения ostream (= basic_ostream<char, char_traits<char> >).

Обоснование заголовка заключается в том, что эти шаблоныгромоздки, чтобы вперед объявить себя.Для приведенного выше примера это будет выглядеть примерно так:

namespace std {
    template <class CharT>
    class char_traits;

    template <class CharT, class CharTraits>
    class basic_ostream;

    typedef basic_ostream<char, char_traits<char> > ostream;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...