簡體   English   中英

模板類特化enable_if和默認值

[英]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>::valuetrue ,則enable_if<T>::typevoid ,並且選擇了特化。 但是,我的查詢與以下情況下的選擇有關。

template <typename T,
    typename std::enable_if_t< some_trait<T>::value,T>::type >
struct test{};

當為::type提供第二個非void模板參數for enable_if時,即使some_trait<T>::valuetrue ,也選擇了非some_trait<T>::value模板,因為::typeT而不是void ,因此不匹配主模板中的默認值。

我的問題是標准中的哪個部分描述了選擇模板的順序,為什么實例化test<T,void>被認為是更好的匹配然后test<T,T>

https://ideone.com/7v4TTS

完整樣本:

#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 >::typeint 它不符合typename Enable類型,它被要求void

test<int> v; test<int, void> v; (感謝默認類型)。

test<int, int> v; 會選擇你的上一次專業化。

我的問題是標准中的哪個部分描述了選擇模板的順序,為什么實例化test<T,void>被認為是更好的匹配然后test<T,T>

[temp.class.spec.match]

您編寫了test<int> ,這意味着您沒有為第二個參數提供任何模板參數。 因為它有一個默認參數,所以選擇它,所以你實際上有test<int, void>

現在,根據上面鏈接的文本,模板參數與專業化相匹配。

在第一種情況下,在評估之后,特化是test<int, void> ,因此它是精確匹配並被選擇。

在第二種情況下,在評估之后,特化是test<int, int> ,這不是完全匹配,因此選擇主模板而不是該特化。

暫無
暫無

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

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