【问题标题】:C++ boost forward declaration questionC++ boost前向声明问题
【发布时间】:2010-08-05 12:24:12
【问题描述】:

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

在库的某些部分,yyy_fwd.hpp 的想法非常普遍(参见boost/detailboost/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&lt;char, char_traits&lt;char&gt; &gt;)。

      标题的基本原理是,这些模板转发声明自己很麻烦。对于上面的例子,它看起来像:

      namespace std {
          template <class CharT>
          class char_traits;
      
          template <class CharT, class CharTraits>
          class basic_ostream;
      
          typedef basic_ostream<char, char_traits<char> > ostream;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 2016-02-15
        相关资源
        最近更新 更多