bindでDeleterを簡略化

昨日のエントリで、boost::bind使えるはずだよ的なことを書いたので、その補足。

#define BOOST_BIND_ENABLE_STDCALL
#include <windows.h>
#include <boost/shared_ptr.hpp>
#include <boost/bind.hpp>


template <typename T>
struct deref_ptr;
template <typename T>
struct deref_ptr<T *> { typedef T type; };

using boost::shared_ptr;
typedef shared_ptr<deref_ptr<HWND>::type> shared_hwnd;
typedef shared_ptr<deref_ptr<HGDIOBJ>::type> shared_hgdiobj;
typedef shared_ptr<deref_ptr<HDC>::type> shared_hdc;
typedef shared_ptr<deref_ptr<HPEN>::type> shared_pen;
typedef shared_ptr<deref_ptr<HBRUSH>::type> shared_brush;
typedef shared_ptr<void> shared_object;
typedef COLORREF color_t;

using boost::bind;

inline shared_hdc get_dc(shared_hwnd h) {
	return shared_hdc(GetDC(h.get()), bind(ReleaseDC, bind(&shared_hwnd::get, h), _1));
}
inline shared_pen create_pen(int style, int width, color_t color) {
	return shared_pen(CreatePen(style, width, color), DeleteObject);
}
inline shared_brush create_solid_brush(color_t color) {
	return shared_brush(CreateSolidBrush(color), DeleteObject);
}

inline shared_object select_object(shared_hdc dc, shared_hgdiobj obj) {
	HGDIOBJ old = SelectObject(dc.get(), obj.get());
	return shared_hgdiobj(old, bind(SelectObject, bind(&shared_hdc::get, dc), _1));
}

inline bool line_to(shared_hdc dc, int x, int y) { return LineTo(dc.get(), x, y); }

こんなに簡単になりました。