我花了一些时间研究boost::
库架构,并对以下事实感兴趣:
在库的某些部分,yyy_fwd.hpp
的想法非常常见(例如,请参阅boost/detail
或boost/flyweight
)。
这些文件显然只包含一些基于模板的类的前向声明,据我所知,在编译时可能会受益。
有人可以指出它们在什么情况下有所帮助,我应该在设计自己的模板时使用相同的想法吗?
谢谢。
答案 0 :(得分:3)
需要前向声明来减少编译时依赖性。例如,在实施Pimpl习语时。
另一个案例是,例如,boost::pool
* 依赖于Windows平台上的windows.h
。在创建我的界面时,我不想强迫我的班级用户使用我的界面来包含系统标题。
* 好的,这是一个不好的例子,因为boost/poolfwd.hpp
仍然包含windows.h
,但我希望他们能解决这个问题。我希望你明白这个想法。
答案 1 :(得分:2)
我不知道boost,但这些前向声明也存在于标准库中。例如,<iosfwd>
包含流的前向声明(模板,通常隐藏在typedef后面)。
当声明重载运算符&lt;&lt;&lt;。
时,您将从此标头中受益。在标题中:
#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;
}