10

私は図書館のアーキテクチャを調べることに時間を費やしboost::、次の事実に興味を持っていました。

ライブラリの一部では、yyy_fwd.hppアイデアがかなり一般的に使用されています(boost/detailまたはboost/flyweight例を参照)。

これらのファイルには、明らかに一部のテンプレートベースのクラスの前方宣言のみが含まれており、私が理解している限り、コンパイル時間の点でメリットがあります。

誰かがどのような場合に役立つかを指摘できますか?自分のテンプレートを設計するときに同じアイデアを使用する必要がありますか?

ありがとうございました。

4

2 に答える 2

3

コンパイル時の依存関係を減らすには、前方宣言が必要です。たとえば、Pimplイディオムを実装する場合。

もう1つのケースは、たとえば、boost::pool*windows.hがWindowsプラットフォームに依存している場合です。インターフェイスを作成するときに、クラスのユーザーにインターフェイスを使用してシステムヘッダーを含めるように強制したくありません。


*わかりました、それboost/poolfwd.hppはまだ含まれているので悪い例windows.hですが、私は彼らがこの問題を修正することを願っています。そして、私はあなたがその考えを理解することを望みます。

于 2010-08-05T12:42:00.697 に答える
2

ブーストについてはわかりませんが、これらの前方宣言は標準ライブラリにも存在します。たとえば、<iosfwd>ストリームの前方宣言が含まれています(これはテンプレートであり、通常はtypedefの背後に隠されています)。

オーバーロードされた演算子<<を宣言する場合は、このヘッダーを利用すると便利です。

ヘッダー内:

#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;
}
于 2010-08-05T15:05:17.997 に答える