Boost に std::unique_ptr の移植がないかな、と思ったら有った。

少し前に書いた記事 で紹介した std::unique_ptr の C++98/03 移植が Boost にないのはなんでなんだぜ、
と思っていたら、実は既にあったようなので、ここで紹介します。


Boost.Interprocess.UniquePtr


Boost.Interprocess なんていう仰々しいライブラリに入ってますが、中身はごく普通の unique_ptr です。

http://ideone.com/swLqV :

#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 以降で使えます。