簡體   English   中英

模板類型扣除

[英]Template type deduction

我在模板參數列表中遇到過class = std::enbale_if<condition, type>::type couple times,我知道std::enable_if<B,T>::type什么但不確定class =有什么用? 我的意思是我知道class type_name = type但為什么class =沒有類型名稱? 我什么時候用它?

編輯:這個例子來自這里

template <class T, class U, class = typename enable_if
          <is_lvalue_reference<T>::value ? is_lvalue_reference<U>::value : true>::type>
inline T&& forward(U&& u)
{
    return static_cast<T&&>(u);
}

這是SFINAE (替換失敗不是錯誤)。 下面是兩個示例,其中約束放在struct和class上,以禁止具有不正確類型的實例化。

但不確定class =是什么? 我的意思是我知道類type_name = type但為什么class =中沒有類型名稱? 我什么時候用它?

這是一個未命名的模板參數類型,您可以為其指定名稱但不需要它,因為此參數僅在重載重新使用期間使用(以刪除無效的候選項)。 實際上給它一個名字可能會顯示警告。

http://coliru.stacked-crooked.com/a/25162a3eb107943f

// Allow only T to be floating type (!! actually static_assert would be preferred here)
template<class T,
         class = typename std::enable_if<std::is_floating_point<T>::value>::type>
struct foo {

};

template <class T,
          class = typename std::enable_if<std::is_integral<T>::value>::type>
bool is_even(T i) {return !bool(i%2);}

int main()
{
  // foo<int> f;  //error
  foo<float> f;   //ok

  //is_even(1.1); //error
  is_even(1); //ok

  return 0;
}

[編輯]

我必須說上面的例子不是最好的,並且建議使用static_assert,因為它允許生成信息性錯誤消息。 SFINAE不應用於參數驗證,而應根據提供的類型選擇其他實現。

這是一個未命名的模板類型參數。 就像您可以在未使用的函數參數中省略變量名一樣,您可以在未引用的模板參數中省略參數名稱。

std::enable_if<...>::type的特定情況下,這僅用於SFINAE目的。 具體來說,如果enable_if的布爾值為false,則模板參數推斷將失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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