はSFINAE( "S ubstitution F ailure I S N OT N E rror")、高度テンプレートもののための一般的な技術を使っています。この場合、タイプT
の機能がto_json
であるかどうかを確認するために、(1)のようにテストします。どのように動作する
:表現T::to_json
が整形式である場合(タイプT
内部to_json
という名前のものがある)、decltype(T::to_json)
は有効なタイプを示し、コンストラクタテンプレートが正常に使用することができます。 T::to_json
が悪い形成されている場合(T
内部にto_json
部材が存在しない場合、すなわち)
しかし、それが失敗したT
のテンプレート引数を置き換えることを意味します。 SFINAEでは、これはプログラム全体のエラーではありません。それはテンプレートが(クラスの一部ではないかのように)それ以上の配慮から削除されたことを意味します。
タイプT
にメンバto_json
がある場合、タイプT
のオブジェクトを使用してJson
オブジェクトを初期化することができます。 T
にそのようなメンバーがない場合、コンストラクターは存在しません。 (1)私は言って粗試験
ためT
は、このような部材を有することを、こののみをチェックします。メンバーが引数なしで呼び出すことができる関数であることをチェックせず、Json
の別のコンストラクタが受け入れることができるものを返します。
template <class T, class = std::enable_if_t<std::is_constructible<Json, decltype(std::declval<const T>().to_json())>::value>>
Json(const T & t) : Json(t.to_json()) {}
[Live example]
Googleの "SFINAE":タイトフィットテストは、次のようになります。 – Angew