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 以外ではつかわれてないのかな。