今回はSFINAEについて
SFINAE(スフィネエ)・・・テンプレートをインスタンス化する際に置き換え失敗を検知したら、
その関数をオーバーロードの候補から外す
例)
↓実行結果
something()関数のテンプレートのテンプレートパラメータ T に value_typeという型が
あるかどうかで適したオーバーロードを行う。
・テンプレートをインスタンス化する動き
1. widgetの場合
somethingにwidgetを渡すと以下のようにインスタンス化する
例) void something_of_widget(widget::value_type*)
→これはOK
2. intの場合
somethingにintを渡す場合のインスタンス化
例) void something_of_int(int::value_type*)
→テンプレートの置き換え失敗
このような場合にSFINAEが働く → この関数をオーバーロードの対称から外す
次のオーバーロード対称を探し、2番目のsomethingが呼び出される。
型特性メタ関数
・・・型の特徴(整数型、ポインタ型、参照型、クラス、継承関係)を判定したり型の特徴を操作したりする為のメタ関数です。
例)
↓実行結果
※ cout << boolalpha・・・”true”, “false”という文字列を使用してbool型の入出力を可能にする
http://www.cppll.jp/cppreference/cppio_flags.html
明示的特殊化、部分特殊化だけでは表現できない型特性ではSFINAEを使用する。
書いてみましたが、constexprを使用できない為テストはできませんでしたorz
http://boleros.hateblo.jp/entry/20120617/1339907438
0 件のコメント:
コメントを投稿