2017-05-24 56 views
1

我想知道when專業化是如何在boost::hana::when<false>案例沒有案例基礎的情況下工作的。boost :: hana tag_of implementation

boost::hana::tag_of實現:

template<bool condition> 
struct when; // forward declaration only 

template<typename T, typename = void> 
struct tag_of; 

template<typename T, typename> 
struct tag_of : tag_of<T, when<true> > 
{}; 

template<typename T, bool condition> 
struct tag_of<T, when<condition> > 
{ 
    using type = T; 
}; 

和測試例如:

struct my_tag {}; 
struct my_tag2 {}; 

namespace boost { 
    namespace hana { 

     template<class T> 
     struct tag_of<T, when<std::is_same<T, int>{}()> > 
     { 
      using type = my_tag; 
     }; 

     template<class T> 
     struct tag_of<T, when<std::is_same<T, unsigned>{}()> > 
     { 
      using type = my_tag2; 
     }; 
    } 
} 

int main() 
{ 
    using type = boost::hana::tag_of<int>::type; 
    std::cout << std::is_same<type, my_tag>{} << std::endl; 
} 

,我不知道爲什麼std::is_same<T, int>{}()(或::value這是相同的),是一個更專業的偏特比std::is_same<T, unsigned>{}(),以及爲什麼,如果兩種情況的條件都是錯誤的,when<condition>更專業。

我已經完成了許多元函數,並且使用了專業化和參數包以及排序,但在這種情況下,有些東西我看不到。

的事情是,我不明白爲什麼when模板的truefalse值能夠決定的事情,如果有對false情況下,沒有默認實現。

回答

1

和我不知道爲什麼std::is_same<T, int>{}()(或者與::value這是相同的),比std::is_same<T, unsigned>{}()更專門的部分特,爲什麼呢,如果條件爲兩個的情況下假,when<condition>是更專門的。

這是不是更專業。他們根本就不是可行的專業化。讓我們來看看當我們嘗試實例化hana::tag_of<int>時會發生什麼。

  1. 填寫默認模板參數。在這種情況下,第二個模板參數默認爲void,所以我們真的有hana::tag_of<int, void>
  2. 考慮哪些部分專業化是可行的。在這種情況下,它們是可行的 - 我們的類型(int)不是參考或cv合格的,它不是任何種類的when<condition>。由於沒有任何專業化是可行的,我們實例化主模板。
  3. 小學tag_of<T, void>繼承tag_of<T, when<true>>。所以現在我們需要實例化第二種類型,這意味着我們重做第二步。
  4. 現在,有兩個不同的專業有可行的:

    // from hana's core 
    template <typename T, bool condition> 
    struct tag_of<T, when<condition>> 
    
    // yours 
    template <typename T> 
    struct tag_of<T, when<std::is_same<T, int>{}()>> 
    

    請注意,您的其他專業化是不可行 - 因爲std::is_same<T, unsigned>{}false,我們正在嘗試匹配when<true>

  5. 在這兩個專業之間,如果我們通過部分排序規則 - 那麼它是更加專業化的 - 因此它被選中並實例化。

因此,hana::tag_of<int>::typehana::tag_of<int, void>::typehana::tag_of<int, when<true>>::typehana::tag_of<int, when<std::is_same<T, int>{}()>>::typemy_tag


的事情是,我不明白爲什麼的的truefalse值時,模板能夠決定的事情,如果有對false情況下,沒有默認實現。

上面有希望說明了它的重要性。我們沒有直接實例化when<false>,但是你可以編寫一個專業化代碼到when<false>(如when<std::is_same<T, unsigned>{}()>專業化)。

以及爲什麼,如果條件是false這兩種情況下,when<condition>是更專業。

由於我們實例when<true>,那些專業化,其條件false簡單地從候選集中排除。可行的專業化清單只是簡化爲hana直接提供的清單。這不是「更專業化」 - 它是完全可行的。


同樣值得注意的是,tag_of爲您提供了多種專業化方法。您可以提供一些布爾條件使用void_t。或者,你可能只是專門頂級:

template <> 
struct tag_of<int, void> { 
    using type = my_tag; 
}; 

這會在上述步驟#2短路,跳過所有其他實例。

+0

這是驚人的美麗。謝謝。 –