2010-08-05 72 views
10

我花一些時間檢查boost::庫架構和有興趣與以下事實:C++升壓向前聲明的問題

yyy_fwd.hpp想法是使用非常普遍的庫的某些部分(例如參見boost/detailboost/flyweight)。

這些文件顯然只包含一些基於模板的類的前向聲明,據我所知,可以在編譯時間方面受益。

難道有人指出他們在什麼情況下可以提供幫助,我應該在設計自己的模板時使用相同的想法嗎?

謝謝。

回答

3

需要前向聲明以減少編譯時間依賴性。例如,在實施Pimpl成語時。

再一種情況是,例如,boost::pool*取決於Windows平臺上的windows.h。在創建我的界面時,我不想強​​迫我的班級的用戶通過使用我的界面來包含系統標題。


*好吧,這是一個不好的例子,因爲boost/poolfwd.hpp還包括windows.h,但我希望他們會解決這個問題。我希望你明白這個主意。

+0

+1爲良好的壞例子:-) – 2010-08-05 15:34:35

2

我不知道boost,但這些前向聲明也存在於標準庫中。例如,<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; 
}