ページ

2014年8月7日木曜日

C++と戯れる 2 - SFINAE -

今回は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 件のコメント:

コメントを投稿