私はそのようなコードを見つけました:
template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
return a+b;
}
私はすべての詳細を把握しましたが、それは私にとっては新しいことでしたが、1つだけです。教えてください、どこで読むことができますか、矢印演算子(->
)関数の見出しの意味?純粋に論理的には、->
演算子は、auto
によって取得される型を決定しますが、これをまっすぐに取得したいのですが、情報が見つかりません。
C++ 11には、関数宣言の2つの構文があります。
return-typeidentifier(
引数宣言...)
そして
auto
identifier(
引数宣言...)
->
return_type
それらは同等です。今、それらが同等であるとき、なぜあなたは後者を使用したいのですか?さて、C++ 11では、式の型を説明できるこのクールなdecltype
を導入しました。そのため、戻り値の型を引数の型から派生させたい場合があります。だからあなたは試してください:
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
コンパイラは、a
引数にb
とdecltype
が含まれているかどうかを知らないことを通知します。これは、引数リストによってのみ宣言されているためです。
declval
と既に宣言されているテンプレートパラメーターを使用することで、問題を簡単に回避できます。好む:
template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);
現在、非常に詳細になっています。したがって、代替宣言構文が提案および実装され、次のように記述できます。
template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);
冗長性が低く、スコープルールを変更する必要はありませんでした。
C++ 14 update: C++ 14では、
auto
identifier(
引数宣言...)
関数が使用前に完全に定義されており、すべてのreturn
ステートメントが同じ型に推定される限り。 ->
構文は、ソースファイルで本文を非表示にする場合、パブリック関数(ヘッダーで宣言)で引き続き有用です。テンプレートを使用してそれを行うことはできませんが、他の方法では書きにくい具体的なタイプ(通常はテンプレートメタプログラミングから派生)があります。
平易な英語では、戻り型がa
とb
の合計の推定型であることを示しています。