如果我們在這一函數模板,模板參數推導
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;
};
基本上有兩個問題:
- 編譯器可以推斷出在第二個例子中的模板參數?
- 如果不是,那爲什麼?有什麼困難嗎?如果標準沒有說出「從函數體」「模板參數推導的任何內容,那麼是不是因爲參數不能推導出來?或者它沒有考慮這樣的推論,以避免增加語言的複雜性?或者是什麼?
我想知道你對這樣的推論的看法。
編輯:
順便說,海灣合作委員會是能夠推斷出函數的參數,如果我們寫這樣的代碼:http://www.ideone.com/cvXEA
不:
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/UX038
請你詳細說明一下嗎? – Nawaz 2011-01-25 21:50:32