ゆとりーなの日記

日記的な事を書いて行くと思はれる

ハンドルの型がintとかでも萎えずにunique_ptr

元ネタ:std::unique_ptrとカスタムデリータ使ったやっつけリソース管理メモ - joynote break;
DXライブラリの画像ハンドルはそういえばintだったなぁと思いつつ、いやでもハンドル保持の為に領域動的確保は流石にあれなので、カスタムデリータはこういうときにも対処できるのですという宣伝をしておきます。

#include <memory>
#include <Dxlib.h>

struct dx_image_delete {
  typedef int pointer;
  void operator ()(const int handle) const {
    DeleteGraph(handle);
  }
};

typedef std::unique_ptr<int, dx_image_delete> dx_image_handle;

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
  ChangeWindowMode(TRUE);
  if (!(~DxLib_Init())) { 
    return 0;
  }
  SetDrawScreen(DX_SCREEN_BACK) ;
  while(!ProcessMessage() && !CheckHitKey(KEY_INPUT_ESCAPE)) {
    ClearDrawScreen();
    const dx_image_handle graph_handle(LoadGraph("test.bmp"));
    DrawGraph(100, 100, graph_handle.get(),TRUE);
    ScreenFlip() ;
  }
  DxLib_End();
  return 0;
}

うーん、この場合std::unique_ptrのテンプレート第一引数は実質無視されてる感じがしますが、ここには何を入れるのがいいんでしょうか。まぁ違う者同士をやり取りするのは無理ですので、std::remove_pointer::typeとかを突っ込んどいてtypedefしたのを使うのが分かり易いんですかね。
追記:
どうもすばる先生曰くintがNullablePointerじゃないのでpointerとしては本来は使えないらしいです。というわけでこれはVC++2010でしか通らないっぽいです。