私は本「テンプレート完全ガイド」を読んでいました、セクション:12.2.1署名私は著者の文を理解できませんでした:
関数が関数テンプレートから生成された場合、戻り値の型
「関数テンプレートによって生成された関数」とはどういう意味ですか? 、彼はここで template-id について話しているのですか? もしそうなら、署名は私たちによって定義されているので、なぜ戻り値の型が問題になるのでしょうか?
些細な例が役に立ちます、ありがとう。
セクション 12.2.1 で、著者は関数の宣言が共存できる状況について説明しています。関数テンプレートの宣言は、戻り値の型が異なる場合でも共存できます。たとえば、次のように宣言できます。
template <typename T> int f();
tepmlate <typename T> char f();
これらの関数を非テンプレートにすると、宣言することさえできなくなります。もちろん、上記の形式では関数を呼び出すことはできませんが、キャストを使用して関数の 1 つを明示的に選択できる場合があります (これについてはよくわかりません)。
異なる戻り値の型を持つ関数を共存させる主な用途は (これは本来の意図ではありませんでしたが)、条件に基づいてオーバーロード セットからこれらの関数の一部を削除することです。
template <typename T>
typename std::enable_if<std::numeric_limits<T>::is_specialized, T>::type
f(T); // used for types for which std::numeric_limits<T> is specialied
template <typename T>
typename std::enable_if<!std::numeric_limits<T>::is_specialized, T>::type
f(T); // used for types for which std::numeric_limits<T> is not specialied