今日は、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に乗り移るまでの暫定処置としていかがでしょうか。
スポンサード リンク |
この記事のカテゴリ
- C++ ⇒ Boostのunique_ptrをstd::unique_ptrのようにする