この関数テンプレートがある場合、
template<typename T>
void f(T param) {}
次に、次のように呼び出すことができます。
int i=0;
f<int>(i);//T=int : no need to deduce T
f(i); //T=int : deduced T from the function argument!
//likewise
sample s;
f(s); //T=sample : deduced T from the function argument!
ここで、上記の関数テンプレートのこのバリアントについて考えてみましょう。
template<typename TArg, typename TBody>
void g(TArg param)
{
TBody v=param.member;
}
さて、次のように記述した場合、コンパイラはテンプレート引数を推測できますか?
sample s;
g(s); //TArg=sample, TBody=int??
sample
と定義されていると仮定します。
struct sample
{
int member;
};
基本的に2つの質問があります:
- コンパイラは、2番目の例でテンプレート引数を推測できますか?
- いいえの場合、なぜですか?何か問題はありますか?標準が「関数本体からのテンプレート引数の推定」について何も述べていない場合、それは引数を推定できないためですか?それとも、言語がさらに複雑になるのを避けるために、そのような控除を考慮していませんでしたか?または何?
そのような控除についてのあなたの見解を教えてください。
編集:
ちなみに、次のコードを記述すれば、GCCは関数の引数を推測できます。
template<typename T>
void h(T p)
{
cout << "g() " << p << endl;
return;
}
template<typename T>
void g(T p)
{
h(p.member); //if here GCC can deduce T for h(), then why not TBody in the previous example?
return;
}
この例の実演デモ:http ://www.ideone.com/cvXEA
前の例のデモが機能しない:http ://www.ideone.com/UX038