いくつかの関数を考えてみましょう:
template<typename F>
void foo(F f) {
std::unique_ptr<int> p = f();
// do some stuff with p
}
unique_ptr
はデフォルトのテンプレート引数 , default_delete
for を宣言するため、 に渡され、デフォルト以外のデリータでを返すD
関数オブジェクトはコンパイルに失敗します。例えば、foo
unique_ptr
int x = 3;
foo([&x](){
// use empty deleter
return std::unique_ptr<int>(&x, [](int*){});
});
ただし、これが役立つ可能性があることはわかりましたが、それが不可能な直接的な理由はわかりません。これに対処するための一般的なアプローチはありますか?
編集
foo
簡単な修正は、代わりに次を使用するように定義することです。
std::unique_ptr<int, std::function<void(int*)>> p = f();
しかし、なぜこれを のインターフェースに組み込むことができなかったのunique_ptr
でしょうか? クラス インターフェイスがこのジェネリック属性を提供できない理由はありますか? この種のものを新しい定義に「ラップ」するためのアプローチはありますか?
例えば、
template<typename T>
using Generic_unique_ptr =
std::unique_ptr<
T,
std::function< void(typename std::unique_ptr<T>::element_type*) >
>;
しかし、これは次のようなことを行う可能性があるため、危険に思えます。
Generic_unique_ptr<int> p(new int());
これにより、デリータが初期化されず、未定義の動作が示されます。おそらく、デフォルトのデリータとして のインスタンスを提供する方法はありますか? std::default_delete<T>