2017-08-15 4 views
1

私はmain json11 header fileのソースコードを読んでいます。私はテンプレート宣言が、無成功内部decltypeclassのこの使用方法に関するいくつかのドキュメントを見つけようとしている暗黙のコンストラクタに関するjson11ライブラリのコード解説

template <class T, class = decltype(&T::to_json)> 
Json(const T & t) : Json(t.to_json()) {} 

それは次の宣言が含まれています。

この構成/使用法はC++で名前を持っていますか?それについての良い参考資料ですか?

+0

Googleの "SFINAE":タイトフィットテストは、次のようになります。 – Angew

答えて

1

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]

+0

明確な説明をありがとう。どのように「きれいな」小切手をしますか?それはコンパイル時にきれいに可能ですか? – yageek

+0

更新ありがとうございます:) – yageek

関連する問題