c – 如何在独立的命名空间中包装BOOST?

前端之家收集整理的这篇文章主要介绍了c – 如何在独立的命名空间中包装BOOST?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在将BOOST的两个版本同时编译成一个项目.理想情况下,它们应该沿着这些方向可用:
boost_1_36_0::boost::shared_ptr<SomeClass> someClass = new SomeClass();
boost_1_35_0::boost::regex expression("[0-9]",boost_1_35_0::boost::regex_constants::basic);

解决方法

我读过(很好的扫描)通过 development list discussion.没有简单的解决方案.总结一下:

>在命名空间声明中封装头文件

namespace boost_1_36_0 {
    #include <boost_1_36_0/boost/regex.hpp>
}
namespace boost_1_35_0 {
    #include <boost_1_35_0/boost/shared_ptr.hpp>
}

>需要修改文件
>不允许两个版本都包含在同一个翻译单元中,因为宏不遵守命名空间.

>在包括标题之前定义boost

#define boost boost_1_36_0
    #include <boost_1_36_0/boost/regex.hpp>
#undef boost
#define boost boost_1_35_0
    #include <boost_1_35_0/boost/shared_ptr.hpp>
#undef boost

>源文件可以使用-Dboost = boost_1_36_0进行编译
>仍然没有解决单个翻译单元中的宏冲突.
>一些内部的头文件包含可能会被弄乱,因为这样的事情确实发生了.

#if defined(SOME_CONDITION)
#  define HEADER <boost/some/header.hpp>
#else
#  define HEADER <boost/some/other/header.hpp>
#endif

但是,解决这些情况可能很容易.

>修改整个升级库以使用命名空间boost_1_36_0 {…}替换命名空间boost {..},然后提供命名空间别名.用BOOST_1_36_0_XYZ宏替换所有BOOST_XYZ宏及其用途.

>如果你愿意付出努力,这可能会有效.

猜你在找的C&C++相关文章