如果我们有这个函数模板,
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;
};
基本上有两个问题:
- 编译器可以推导出第二个示例中的模板参数吗?
- 如果不是,那为什么?有什么困难吗?如果标准没有说明“从函数体中推导模板参数”,那么是因为无法推导参数吗?或者它没有考虑这样的推论以避免增加语言的复杂性?或者是什么?
我想知道你对这种扣除的看法。
编辑:
顺便说一句,如果我们编写以下代码,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