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); }
こんなに簡単になりました。