少し前に書いた記事 で紹介した std::unique_ptr の C++98/03 移植が Boost にないのはなんでなんだぜ、
と思っていたら、実は既にあったようなので、ここで紹介します。
Boost.Interprocess なんていう仰々しいライブラリに入ってますが、中身はごく普通の unique_ptr です。
#include <boost/interprocess/smart_ptr/unique_ptr.hpp> // default_delete は自前で用意しなければいけない(めんどい…) #include <boost/checked_delete.hpp> template<class T> struct default_delete { void operator()( T* p ) const { boost::checked_delete( p ); } }; // いちいち毎回デリータ指定書くの面倒なのでメタ関数にしておく // template aliases 欲しい。 template<class T> struct unique_pointer { typedef boost::interprocess::unique_ptr< T, default_delete<T> > type; }; // それ以外は普通に std::unique_ptr (の C++98/03 移植) #include <iostream> #include <boost/noncopyable.hpp> struct hoge : private boost::noncopyable { hoge() { std::cout << "hoge\n"; } ~hoge() { std::cout << "~hoge\n"; } }; // factory function unique_pointer<hoge>::type make_hoge() { return unique_pointer<hoge>::type( new hoge() ); } #include <boost/assert.hpp> int main() { typedef unique_pointer<hoge>::type pointer; pointer p1 = make_hoge(); pointer p2 = move(p1); // move されてることを確認 BOOST_ASSERT( !p1 && p2 ); }
12/11, 2010 修正:
default_delete を作らなくても、 boost::checked_deleter を使えばいいみたいです。
http://ideone.com/Y9GU6
#include <boost/interprocess/smart_ptr/unique_ptr.hpp> // デリータは明示的に指定しなければいけない。今回は boost::checked_deleter を使う #include <boost/checked_delete.hpp> // 毎回指定するのは面倒なのでメタ関数に template<class T> struct unique_pointer { typedef boost::interprocess::unique_ptr< T, boost::checked_deleter<T> > type; }; // それ以外は普通に std::unique_ptr (の C++98/03 移植) #include <iostream> #include <boost/noncopyable.hpp> struct hoge : private boost::noncopyable { hoge() { std::cout << "hoge\n"; } ~hoge() { std::cout << "~hoge\n"; } }; // factory function unique_pointer<hoge>::type make_hoge() { return unique_pointer<hoge>::type( new hoge() ); } #include <boost/assert.hpp> int main() { typedef unique_pointer<hoge>::type pointer; pointer p1 = make_hoge(); pointer p2 = move(p1); // move されてることを確認 BOOST_ASSERT( !p1 && p2 ); }
弱点は、ヘッダの名前が
毎回 Deleter を指定する必要があって正直面倒なこと、でしょうか。
それ以外は拍子抜けするほど普通の unique_ptr なので、
C++0x が使えないときは、どんどん使ってみるといいんじゃないでしょうか。
あ、バージョンは 1.35.0 以降で使えます。