如何将BOOST包装在单独的命名空间中?

Ecl*_*pse 9 c++ boost namespaces

我希望同时将两个版本的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);
Run Code Online (Sandbox Code Playgroud)

Ecl*_*pse 10

我通过开发列表讨论阅读(扫描得很好).没有简单的解决方案.总结一下:

  1. 在头文件声明中包装头文件

    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>
    }
    
    Run Code Online (Sandbox Code Playgroud)
    • 需要修改源文件
    • 由于宏不遵循名称空间,因此不允许将两个版本包含在同一个转换单元中.
  2. 在包含标题之前定义提升

    #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
    
    Run Code Online (Sandbox Code Playgroud)
    • 源文件可以简单地编译 -Dboost=boost_1_36_0
    • 仍然没有解决单个翻译单元中的宏冲突.
    • 一些内部头文件包含可能会混乱,因为这种事情确实发生了.

      #if defined(SOME_CONDITION)
      #  define HEADER <boost/some/header.hpp>
      #else
      #  define HEADER <boost/some/other/header.hpp>
      #endif
      
      Run Code Online (Sandbox Code Playgroud)

      但是解决这些问题可能很容易.

  3. 修改整个boost库以替换namespace boost {..},namespace boost_1_36_0 {...}然后提供命名空间别名.替换所有BOOST_XYZ宏及其用途BOOST_1_36_0_XYZ.
    • 如果你愿意付出努力,这可能会奏效.