28
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

decltypeの小技

Last updated at Posted at 2014-11-18

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

ううむ、パッと思いつくのはこれくらい。
もっとあると思って書き始めたのに。

28
30
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?