C++ boost前向声明问题

10

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

在某些库的部分中,非常常见地使用了yyy_fwd.hpp的想法(例如请参考boost/detailboost/flyweight)。

很显然,这些文件仅包含某些基于模板的类的前向声明,据我所知,可以从编译时间上获益。

有人能指出它们何时有帮助,并且在设计自己的模板时是否应该使用相同的想法?

谢谢。

2个回答

3
前置声明在减少编译时依赖方面非常有用。例如,当实现Pimpl习惯用法时。
另一个情况是,例如,在Windows平台上,boost::pool取决于windows.h。创建接口时,我不想通过使用我的接口强制类的用户包括系统头文件。
注:好吧,这是个糟糕的例子,因为boost/poolfwd.hpp仍然包含windows.h,但我希望他们能解决这个问题。我希望你懂我的意思。

2

我不知道boost,但是这些前向声明也存在于标准库中。例如,<iosfwd> 包含流的前向声明(它们是模板,通常隐藏在typedef后面)。

当声明重载的operator<<时,您将受益于此头文件。

在您的头文件中:

#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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接