我花一些時間檢查boost::
庫架構和有興趣與以下事實:C++升壓向前聲明的問題
在yyy_fwd.hpp
想法是使用非常普遍的庫的某些部分(例如參見boost/detail
或boost/flyweight
)。
這些文件顯然只包含一些基於模板的類的前向聲明,據我所知,可以在編譯時間方面受益。
難道有人指出他們在什麼情況下可以提供幫助,我應該在設計自己的模板時使用相同的想法嗎?
謝謝。
我花一些時間檢查boost::
庫架構和有興趣與以下事實:C++升壓向前聲明的問題
在yyy_fwd.hpp
想法是使用非常普遍的庫的某些部分(例如參見boost/detail
或boost/flyweight
)。
這些文件顯然只包含一些基於模板的類的前向聲明,據我所知,可以在編譯時間方面受益。
難道有人指出他們在什麼情況下可以提供幫助,我應該在設計自己的模板時使用相同的想法嗎?
謝謝。
需要前向聲明以減少編譯時間依賴性。例如,在實施Pimpl成語時。
再一種情況是,例如,boost::pool
*取決於Windows平臺上的windows.h
。在創建我的界面時,我不想強迫我的班級的用戶通過使用我的界面來包含系統標題。
*好吧,這是一個不好的例子,因爲boost/poolfwd.hpp
還包括windows.h
,但我希望他們會解決這個問題。我希望你明白這個主意。
我不知道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;
}
+1爲良好的壞例子:-) – 2010-08-05 15:34:35