-1

私は本「テンプレート完全ガイド」を読んでいました、セクション:12.2.1署名私は著者の文を理解できませんでした:

関数が関数テンプレートから生成された場合、戻り値の型

「関数テンプレートによって生成された関数」とはどういう意味ですか? 、彼はここで template-id について話しているのですか? もしそうなら、署名は私たちによって定義されているので、なぜ戻り値の型が問題になるのでしょうか?

些細な例が役に立ちます、ありがとう。

4

1 に答える 1

2

セクション 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
于 2012-11-10T19:42:55.837 に答える