C ++提升前瞻性声明问题

时间:2010-08-05 12:24:13

标签: c++ boost forward-declaration

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

在库的某些部分,yyy_fwd.hpp的想法非常常见(例如,请参阅boost/detailboost/flyweight)。

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

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

谢谢。

2 个答案:

答案 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;
}