久々なので、大げさな題を付けました。

新しいWindowsでしか実行できない関数を使うときの1つの手段として、GetProcAdressがあります。C++0xのdecltypeは、そのやり方を大きく変えます。

1
2
3
4
5
6
7
HMODULE hmodKernel =
    GetModuleHandle(TEXT("kernel32"));
 
typedef decltype(CancelSynchronousIo)* PCancelSynchronousIo;
PCancelSynchronousIo pCancelSynchronousIo =
    reinterpret_cast<PCancelSynchronousIo>(
        GetProcAddress(hmodKernel, "CancelSynchronousIo"));

今までだったら、MSDNライブラリあるいはヘッダファイルを直接見るなどして、typedef BOOL (WINAPI *PCancelSynchronousIo)(HANDLE hThread);とtypedefを書く必要がありました。ところが、decltypeを使うと、このとおり関数名から直接、型を取り出せます。

つまり、<windows.h>以下の膨大な関数の宣言がそのままGetProcAddress利用時にも使い回せるようになったことを意味します。使える状況がやや限られますが、autoと組み合わせれば、typedefを使わないことすら可能です。私は、「あり」だと思いますが、(C# 3.0のvarのときの様子からすれば、特にautoについて)受け入れがたいと感じる人もある程度いると思います。

1
2
3
4
auto pCancelSynchronousIo =
    reinterpret_cast<decltype (CancelSynchronousIo)*>(
        GetProcAddress(
            hmodKernel, "CancelSynchronousIo"));

あと、result_type (__stdcall *fn_ptr)(…)のようなstdcall関数へのポインタの書き方も、よく忘れるので毎度調べる羽目になります。よその掲示板でも時々この書き方についての質問を見るという印象を持っています。これから解放されるのも嬉しい点です。

autoはともかく、decltypeは、Win32APIを使う人たちの中で、普段クラスやテンプレートを使わない人の間にも是非広まって欲しい機能だと思っています。

前回のVisual Studio 2010 CTPではautoがあるのに、decltypeがなくて心底がっかりしました。あと、昔から類似品の__typeofのあったgccはうらやましかったです。なお、今はg++でもdecltypeが使えます。

スポンサード リンク

この記事のカテゴリ

  • ⇒ Visual C++ 2010でWin32APIプログラミングは革命を迎える
  • ⇒ Visual C++ 2010でWin32APIプログラミングは革命を迎える