std::unique_ptr に関数のカスタムデリータを渡す
それ、Boost.MultiIndex の global_fun 出できるよ!って事でやってみました。
[ソース]
#include <boost/multi_index/global_fun.hpp> #include <memory> #include <iostream> namespace mi = boost::multi_index; void deleter(int* p){ std::cout << "delete" << std::endl; delete p; } int main(){ std::unique_ptr<int, mi::global_fun<int*, void, &deleter>> p(new int(10)); std::cout << *p << std::endl; return 0; }
[出力]
10 delete
こんな感じで、global_fun でラップして std::unique_ptr に型として渡しています。
C++11 の lambda expression が渡せないのがちょっと悲しいですが…。
個人的に Boost.MultiIndex の global_fun とかは Boost.MPL とかにあってもいいと思うの。
mem_fun を使えば、メソッドとかも渡すことが出来ますね。
#include <boost/multi_index/mem_fun.hpp> std::unique_ptr<hoge, mi::mem_fun<hoge, void, &hoge::release>> p(new hoge());
あと Template Aliases が使えればこんな感じで定義することも。
template<typename T> void delete_(T* p){ std::cout << "delete" << std::endl; delete p; } template<typename T> using unique_ptr = std::unique_ptr<T, mi::global_fun<T*, void, &delete_<T>>>; unique_ptr<int> p(new int(30));
Template Aliases 便利っすなー。