2017-05-24 7 views
1

boost::hana::when<false>のケースベースがない場合は、whenの特化がどのように機能するのだろうか。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テンプレートの trueまたは false値は関係ができる理由 false場合にはデフォルトの実装がない場合、私は、表示されていないということです。

答えて

1

と私はstd::is_same<T, int>{}()(または同じである::valueで)、std::is_same<T, unsigned>{}()より専門的な部分特殊である理由だろう、との条件が両方の場合はfalseであれば、なぜ、when<condition>は、より専門です。

がさらに特化されています。彼らは単に実用的な専門分野ではありません。 hana::tag_of<int>をインスタンス化しようとするとどうなるかを見てみましょう。

  1. デフォルトのテンプレート引数を入力します。この場合、2番目のテンプレートパラメータのデフォルトはvoidなので、実際にはhana::tag_of<int, void>です。
  2. 実行可能な部分的な特殊化について検討します。この場合、はありませんが実行可能です - 私たちのタイプ(int)は参照またはcv修飾されておらず、when<condition>の種類ではありません。スペシャライゼーションのいずれも実行可能でないため、プライマリテンプレートをインスタンス化します。
  3. tag_of<T, void>tag_of<T, when<true>>を継承します。それでは、この2番目の型をインスタンス化する必要があります。これは、手順2をやり直すことを意味します。
  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. これらの2つの特殊化の間に、部分的な発注ルールを実行すると、より特殊化されます。選択されてインスタンス化されます。したがって

hana::tag_of<int>::typehana::tag_of<int, void>::typehana::tag_of<int, when<true>>::typeあるhana::tag_of<int, when<std::is_same<T, int>{}()>>::typemy_tagあります。


事がfalse場合にはデフォルトの実装はありません場合は、テンプレートは、重要でできたときに私がなぜtrueまたはfalse値が表示されないということです。

上記の説明は、なぜ重要かを示しています。 when<false>を直接インスタンス化しているわけではありませんが、when<false>when<std::is_same<T, unsigned>{}()>特殊化のような)の代わりに専門化を書くことができます。

となり、どちらの場合も条件がfalseの場合、なぜwhen<condition>がより特殊化されているのですか。

when<true>をインスタンス化しているので、条件がfalseの特殊化は候補セットから単純に除外されます。実行可能な専門化のリストは、花が直接提供するものにちょうど縮小されています。それは "より専門的"ではない - それは単に実行可能である。


また、tag_ofには、複数の特殊化方法があります。ブール条件またはのいずれかをvoid_tに指定することができます。その他のすべてのインスタンスをスキップしてステップ#上記2で短絡が、希望

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

:または、あなただけのトップレベルの専門性があります。

+0

驚くほど美しいです。ありがとう。 –

関連する問題