C++11の目玉機能のうちのひとつに、decltypeというものがありますね。
decltype( expression )
で式の型を得ることができる機能です。
今回は、これによる小技をさらっと紹介したいと思います。
- プロトタイプ宣言に使うことができる。
主に関数のフックなどで役に立ちます。
decltype( MessageBoxA ) HookedMessageBoxA;
ちゃんと呼び出し規約なども合わせてもらえるので確実です。
decltype( MessageBoxA )* pHookedMessageBoxA;
ポインタをつけると関数ポインタに。
- 関数の戻り値の型を得ることができる。
decltype( dosomething() ) result;
メタプログラマにはお馴染みの技。
この時、dosomethingは実行されるわけではないので、定義がなされている必要はありません。
int dosomething( int );
double dosomething( double );
decltype( dosomething( 1 ) ) n; // n is int
decltype( dosomething( 1.0 ) ) df; // df is double
std::declvalとコンビを組んだSFINAEが非常に強力なテクニックです。
hoge dosomething( hage );
huge dosomething( hige );
decltype( dosomething( std::declval < hage >() ) ) abc; // abc is hoge
decltype( dosomething( std::declval < hige >() ) ) xyz; // xyz is huge
ううむ、パッと思いつくのはこれくらい。
もっとあると思って書き始めたのに。