- 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[][] );[]
[] }[]
[]}[]