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 便利っすなー。

[コンパイラ]

  • g++ (GCC) 4.7.0 20111112 (experimental)