2017-05-24 55 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

这是惊人的美丽。谢谢。 –