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