今日は、Boost.Interprocessに存在するunique_ptrをstd::unique_ptrのように使う方法です。

Boostにもunique_ptrが存在します: Boost に std::unique_ptr の移植がないかな、と思ったら有った。 – 野良C++erの雑記帳。しかし、このboost::interprocess::unique_ptrは削除子(Deleter)を指定する必要があるのが、std::unique_ptrと違って面倒です。

#include <boost/interprocess/smart_ptr/unique_ptr.hpp>
#include <boost/checked_delete.hpp>
 
int main()
{
  boost::interprocess::unique_ptr<int, boost::checked_deleter<int>> p(
    new int);
  // std::unique_ptrならこれだけで良い。
  // std::unique_ptr<int> p(new int);
}

そこで逆転の発想です。こちらからデフォルト実引数を指定すれば良いのです。

#include <boost/checked_delete.hpp>
 
namespace boost
{
  namespace interprocess
  {
    template<typename T>
    struct default_delete : checked_deleter<T> {};
    template<typename T>
    struct default_delete<T[]> : checked_array_deleter<T> {};
 
    // これ。デフォルト実引数を付けて先に宣言してしまう。
    template<typename T, typename D = default_delete<T>>
    class unique_ptr;
  }
}
 
#include <boost/interprocess/smart_ptr/unique_ptr.hpp>
 
int main()
{
  boost::interprocess::unique_ptr<int> p(new int);
}

決してお行儀が良い方法とは言えないのは承知の上です。std::unique_ptrに乗り移るまでの暫定処置としていかがでしょうか。

スポンサード リンク

この記事のカテゴリ

  • ⇒ Boostのunique_ptrをstd::unique_ptrのようにする