簡體   English   中英

指定模板函數參數的默認值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM