実況

  • IsIteratorCategory::value が falseになるってなんで?
  • IteratorCategoryWithTraversal クラステンプレートの第1引数か。
  • FacadeIteratorCategoryImpl クラステンプレートの引数から導出した IteratorFacadeDefaultCategory::Type が Category になってる。
  • マテ、TypeSelect してた。ユーザー指定の T と IteratorCategoryToTraversal::Type が同型なら Category、そうでなければ IteratorCategoryWithTraversal か。
  • じゃぁ T と IteratorCategoryToTraversal::Type は異なってるのか。

あ"ーこんがらがってきた!
最初から順に行こう。

IteratorAdaptor<PtrIterator<dummyT>, dummyT*, dummyT, Ash::RandomAccessTraversalTag>
  Detail::IteratorAdaptorBase<PtrIterator<dummyT>, dummyT*, dummyT, Ash::RandomAccessTraversalTag, UseDefault, UseDefault>::Type
    Detail::IteratorFacade<PtrIterator<dummyT>, dummyT, Ash::RandomAccessTraversalTag, dummyT&, std::iterator_traits<dummyT*>::difference_type>
      この IteratorFacade の iterator_category 型が引き金。

IteratorFacadeTypes<PtrIterator<dummyT>, dummyT, Ash::RandomAccessTraversalTag, dummyT&, std::iterator_traits<dummyT*>::difference_type> AssociatedTypes;
  Detail::IteratorFacadeTypes<dummyT, Ash::RandomAccessTraversalTag, dummyT&, std::iterator_traits<dummyT*>::difference_type>;
    この IteratorFacadeTypes に iterator_category 型がある。

FacadeIteratorCategory<Ash::RandomAccessTraversalTag, dummyT, dummyT&>::Type
  TypeSelect<
    IsIteratorCategory<CategoryOrTraversal>::value
    , CategoryOrTraversal
    , typename FacadeIteratorCategoryImpl<CategoryOrTraversal, ValueParam, Reference>::Type
    >

わかった。 CategoryOrTraversal を Type2Type しないとだめだ。
しかし、わけわからん…