×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
スマートポインタはいろいろと便利ですが、そのままでは各種ハンドルの保持が出来ません。
大体ハンドルは何かのポインタなので、shared_ptr<void>で保持するのも一つの手ですが、
unique_ptrで十分な箇所ではなんだかもったいない感じです。
かといって、unique_ptrだと関数オブジェクトを作ったりテンプレート引数にいろいろ渡したり不便です。
なので、簡単に利用できるようにテンプレート化してみました。
多分問題なく使用出来るはず……です。
無保証って事で一つ。
適当にコピーとかして使ってください。
大体ハンドルは何かのポインタなので、shared_ptr<void>で保持するのも一つの手ですが、
unique_ptrで十分な箇所ではなんだかもったいない感じです。
かといって、unique_ptrだと関数オブジェクトを作ったりテンプレート引数にいろいろ渡したり不便です。
なので、簡単に利用できるようにテンプレート化してみました。
多分問題なく使用出来るはず……です。
無保証って事で一つ。
適当にコピーとかして使ってください。
#include<functional>
#include<memory>
#include<iostream>
template<typename T>
struct Deleter{
typedef T pointer;
typedef std::function<void(T)> DeleteFunction;
DeleteFunction df;
void operator()(T rc){
df(rc);
}
Deleter(DeleteFunction df){
this->df = df;
}
};
template<typename T>
std::unique_ptr<T, Deleter<T>> CreateUniquePtr(T t, typename Deleter<T>::DeleteFunction df){
return std::unique_ptr<T, Deleter<T>>(t, Deleter<T>(df));
}
int main(){
int i = 42;
{
auto intHolder = CreateUniquePtr(i, [](int i){
std::cout << i << std::endl;
});
}
}
PR
この記事にコメントする