10

我花了一些时间研究boost::图书馆架构,并对以下事实感兴趣:

在库的某些部分,一个yyy_fwd.hpp想法非常普遍(参见boost/detailboost/flyweight示例)。

这些文件显然只包含一些基于模板的类的前向声明,据我所知,它们可能会在编译时间方面受益。

有人可以指出他们在什么情况下有帮助,我在设计自己的模板时应该使用相同的想法吗?

谢谢你。

4

2 回答 2

3

需要前向声明来减少编译时依赖性。例如,在实现 Pimpl idiom 时。

另一种情况是,例如,boost::pool*取决于windows.hWindows 平台。创建我的界面时,我不想强​​迫我的班级的用户使用我的界面来包含系统标头。


*好的,这是一个不好的例子,因为boost/poolfwd.hpp仍然包括windows.h,但我希望他们能解决这个问题。我希望你能明白。

于 2010-08-05T12:42:00.697 回答
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;
}
于 2010-08-05T15:05:17.997 回答