【问题标题】:C++ boost forward declaration questionC++ boost前向声明问题
【发布时间】:2010-08-05 12:24:12
【问题描述】:
我花了一些时间研究 boost:: 库架构,并对以下事实感兴趣:
在库的某些部分,yyy_fwd.hpp 的想法非常普遍(参见boost/detail 或boost/flyweight 示例)。
这些文件显然只包含一些基于模板的类的前向声明,据我所知,它们可能会在编译时间方面受益。
有人能指出他们在哪些情况下有帮助吗?我在设计自己的模板时应该使用相同的想法吗?
谢谢。
【问题讨论】:
标签:
c++
boost
forward-declaration
【解决方案1】:
需要前向声明来减少编译时依赖性。例如,在实现 Pimpl idiom 时。
另外一种情况是,例如boost::pool* 依赖于 Windows 平台上的windows.h。在创建我的界面时,我不想强迫我的类的用户使用我的界面来包含系统标头。
*好吧,这是一个不好的例子,因为boost/poolfwd.hpp 仍然包含windows.h,但我希望他们能解决这个问题。我希望你能明白。
【解决方案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;
}