iterator_castの力

  • Boost.RangeExにあるiterator_castは、adaptorからbaseとなったiteratorを取り出すのだが、名前に反してもっと汎用的なものだと思われる
    • baseメンバ関数を介して、複雑に"修飾された"型のオブジェクトから欲しい型のオブジェクトを取り出す
    • shared_ptrやoptionalなども(型をAssignableにしたりDefaultConstructibleにしたりする)型へのadaptorと考えると適用範囲が増えるかもしれない
  • 以下、その例
    • to_counterはなんらかのOutputIteratorを返すが、それを公開しなくていい
    • adaptor_to/to_baseはiterator_cast/auto_baseとほぼ同じものです

[]void[] []test[][]()[]
[]{[]

[] {[]
[]int[] []const[] []rng[][][] = { [][]0[][],[][]0[][],[][]1[][],[][]1[][],[][]2[][],[][]3[][],[][]3[][],[][]3[][],[][]4[][],[][]4[][],[][]4[][],[][]4[][],[][]4[][],[][]5[][],[][]5[][] };[]
[]int[] []i[][] = [][]oven[][]::[][]unique_copy[][]([][]rng[][], [][]oven[][]::[][]to_counter[][]([][]0[][]))|[][]to_base[][];[]
[]BOOST_CHECK[][]( [][]i[][] == [][]6[][] );[]
[]BOOST_CHECK[][]( [][]7[][] == [][]oven[][]::[][]adaptor_to[][]<[][]int[][]>([][]oven[][]::[][]unique_copy[][]([][]rng[][], [][]oven[][]::[][]to_counter[][]([][]1[][]))) );[]
[] }[]
[] {[]
[]std[][]::[][]wstring[] []rng[][]([][]L[][]"aabbbcccdddeffg"[][]);[]
[]int[] []i[][] = [][]oven[][]::[][]adaptor_to[][]<[][]int[][]>([][]oven[][]::[][]unique_copy[][]([][]rng[][], [][]oven[][]::[][]to_utf8_encoder[][]([][]oven[][]::[][]to_counter[][]([][]0[][]))));[]
[]int[] []j[][] = [][]oven[][]::[][]unique_copy[][]([][]rng[][], [][]oven[][]::[][]to_utf8_encoder[][]([][]oven[][]::[][]to_counter[][]([][]0[][])))|[][]to_base[][];[]
[]BOOST_CHECK[][]( [][]i[][] == [][]j[][] && [][]i[][] == [][]7[][] );[]
[] }[]
[]}[]