[英]Specifying default value for template function argument
你能解釋為什么下面的代碼不能編譯嗎? 一個明顯的解決方法是添加Apply
的1參數重載,是否有更簡單的?
template <typename T>
T Identity(const T& i_val)
{
return i_val;
}
template <typename Val, typename Fn>
Val Apply(const Val& v, Fn fn = Identity<Val>)
{
return fn(v);
}
int main() {
Apply(42); // error: no matching function for call to 'Apply(int)'
Apply(42, Identity<int>); // OK
return 0;
}
模板參數推導不起作用 - 您無法從默認值推導出參數的類型。 但是,在C ++ 11中,您可以指定默認模板參數:
template <typename Val, typename Fn = Val(&)(Val const &)>
Val Apply(const Val& v, Fn fn = Identity<Val>)
{
return fn(v);
}
查找要調用的函數包括:1。創建候選集,其中包括模板參數推導2.確定最佳超載
如果我正確理解標准,只有實際的函數參數(即不是默認的參數)參與推導模板參數。 因此,從參數42
,編譯器唯一可以推斷的是Val
= int
。 重載不會進入候選集,並且永遠不會查看默認參數。
Apply是一個模板化的函數。 您需要執行Apply<MyValueType,MyFuncType>(42);
您可以合理地期望編譯器將Val
推斷為int
,但是您不能指望它推斷函數的類型,即使您已經給出了默認參數。 因此,它不會推斷您正在嘗試調用Apply
函數的聲明。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.