c++0x std::shared_ptr 与 boost::shared_ptr 的比较
我有一段C++代码,里面大量使用了shared_ptr
和STL(标准模板库)。一个常用的头文件是:
#include<boost/shared_ptr.hpp>
using boost::shared_ptr; // for shared_ptr
using namespace std; // for STL
我想现在切换到c++0x(C++11的早期版本),利用一些新特性,使用gcc 4.6并加上-std=c++0x
。不过,现在有了std::shared_ptr
,这就导致了一个问题,因为不明确的shared_ptr
会让人困惑(boost::shared_ptr
和std::shared_ptr
之间的选择)。
当我改用std::shared_ptr
时,像这样:
#include<memory>
using namespace std; // for STL; also imports std::shared_ptr
我就遇到了和boost::python
相关的问题,似乎它只支持boost::shared_ptr
(至少在不做其他调整的情况下):
/usr/include/boost/python/object/make_ptr_instance.hpp:30:52: error: no matching function for call to 'get_pointer(const std::shared_ptr<Cell>&)'
所以我想问的是:
- 有没有简单的方法来解决
boost::shared_ptr
和std::shared_ptr
之间的混淆(除了暂时不使用c++0x)?还有, boost::shared_ptr
最终会不会变成std::shared_ptr
的别名?这样的话,我的问题就能自动解决了。
谢谢!
1 个回答
你需要为你的共享指针类定义一个独立的函数 'get_pointer',这样它才能和 Boost Python 一起正常工作。(注意,这样做可以让你自己编写共享指针,同时还能和 Boost Python 兼容:这是一个有意识的设计,目的是为了避免不同 Boost 库之间的紧密耦合)
你可能会通过使用 boost tr1 兼容头文件来实现这一点,但我没有尝试过。
http://boost.cowic.de/rc/pdf/tr1.pdf
当 Boost.TR1 配置为使用你标准库的原生 TR1 实现时,它的功能就比较简单:它只是包含了相应的头文件。
如果 Boost.TR1 使用的是 Boost 对某个组件的实现,那么它会包含相应的 Boost 头文件,并在 std::tr1 命名空间中导入必要的声明。需要注意的是,只有那些标准中包含的声明会被导入:实现上故意严格,不会在 std::tr1 中包含任何 Boost 特有的扩展,以便捕捉用户代码中的可移植性错误。如果你确实需要使用 Boost 特有的扩展,那么你应该直接包含 Boost 的头文件,并使用 boost:: 命名空间中的声明。需要注意的是,这种实现方式并不完全符合标准,特别是无法在 std::tr1 命名空间中添加用户定义的模板特化。还有一两个 Boost 库尚未完全符合标准,任何这样的不符合都会在 TR1 的主题部分中进行记录。不过,实际上出现不符合标准的情况应该是非常少见的。
如果你使用符合标准的头文件包含(在 boost/tr1/tr1 中),那么这些头文件的名称有时会和现有的标准库头文件冲突(例如 shared_ptr 会被添加到现有的标准库头文件中,而不是它自己的头文件)。这些头文件会通过两种方式转发到你现有的标准库头文件:对于 gcc,它使用 #include_next,而对于其他编译器,它使用宏 BOOST_TR1_STD_HEADER(header)(在 boost/tr1/detail/config.hpp 中定义),这个宏会被解析为 #include <../include/header>。这应该可以在大多数编译器中“开箱即用”,但这意味着这些头文件绝不能放在编译器搜索路径中已经存在的名为 "include" 的目录里。