std::default_delete を特殊化
昨日の続き。 default_delete を特殊化する方がよいかもー、みたいな発言があったので試してみた。
[コード]
#include <memory> #include <iostream> struct X{ friend void X_deleter(X*); X(int value) : value(value){} int value; private: ~X(){}; }; void X_deleter(X* x){ std::cout << "X_deleter" << std::endl; delete x; } namespace std{ template <> struct default_delete<X>{ constexpr default_delete() = default; void operator ()(X* p) const{ X_deleter(p); } }; } // namespace std int main(){ // std::unique_ptr<X, decltype(&X_deleter)> xp(new X(42), &X_deleter); std::unique_ptr<X> xp(new X(42)); std::cout << xp->value << std::endl; return 0; }
[出力]
42 X_deleter
まぁ std::unique_ptr を特殊化するよりかはスマート…かな?
ところで std::default_delete って std::unique_ptr 以外ではつかわれてないのかな。