[英]template class specialization enable_if and default values
鑒於以下內容
template <typename T, typename Enable=void>
struct test{};
template <typename T,
typename std::enable_if< some_trait<T>::value >::type >
struct test{};
假設some_trait<T>::value
為true
,則enable_if<T>::type
為void
,並且選擇了特化。 但是,我的查詢與以下情況下的選擇有關。
template <typename T,
typename std::enable_if_t< some_trait<T>::value,T>::type >
struct test{};
當為::type
提供第二個非void模板參數for enable_if
時,即使some_trait<T>::value
為true
,也選擇了非some_trait<T>::value
模板,因為::type
是T
而不是void
,因此不匹配主模板中的默認值。
我的問題是標准中的哪個部分描述了選擇模板的順序,為什么實例化test<T,void>
被認為是更好的匹配然后test<T,T>
。
完整樣本:
#include <iostream>
#include <type_traits>
template <typename T,typename Enable=void>
struct test
{
const char* value = "Primary";
};
#if 1// toggle this
template <typename T>
struct test<T,typename std::enable_if< std::is_same<T,T>::value >::type >
{
const char* value = "Specialization";
};
#else
template <typename T>
struct test<T,typename std::enable_if< std::is_same<T,T>::value,T >::type>
{ /// ^
const char* value = "Specialization";
};
#endif
int main() {
test<int> v;
std::cout << v.value << std::endl;
return 0;
}
在第一種情況下,您有類型
std::enable_if< true, void >
在第二種情況下,你有類型
std::enable_if< true, int >
std::enable_if< true, int >::type
是int
。 它不符合typename Enable
類型,它被要求void
test<int> v;
是test<int, void> v;
(感謝默認類型)。
test<int, int> v;
會選擇你的上一次專業化。
我的問題是標准中的哪個部分描述了選擇模板的順序,為什么實例化
test<T,void>
被認為是更好的匹配然后test<T,T>
。
您編寫了test<int>
,這意味着您沒有為第二個參數提供任何模板參數。 因為它有一個默認參數,所以選擇它,所以你實際上有test<int, void>
。
現在,根據上面鏈接的文本,模板參數與專業化相匹配。
在第一種情況下,在評估之后,特化是test<int, void>
,因此它是精確匹配並被選擇。
在第二種情況下,在評估之后,特化是test<int, int>
,這不是完全匹配,因此選擇主模板而不是該特化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.