Sprout を使った簡単な constexpr counting_iterator
Sprout の index_iterator で簡単に実装出来そうだったのでちょっと試してみた。
[ソース]
#define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/algorithm/transform.hpp> #include <sprout/iterator/index_iterator.hpp> #include <sprout/array.hpp> #include <sprout/pit.hpp> #include <iostream> template<typename IndexType> struct dummy : sprout::array<IndexType, 1>{ typedef IndexType reference; typedef IndexType size_type; constexpr IndexType at(IndexType i) const{ return i; } constexpr IndexType operator[](IndexType i) const{ return i; } }; template<typename IndexType> constexpr sprout::index_iterator<dummy<IndexType>> counting_iterator(IndexType index){ return { dummy<IndexType>{}, index }; } constexpr int twice(int n){ return n + n; } int main(){ static constexpr auto result = sprout::transform( counting_iterator(-5), counting_iterator(5), sprout::pit<sprout::array<int, 10>>(), twice ); for(auto&& n : result){ std::cout << n << std::endl; } return 0; }
[出力]
-10 -8 -6 -4 -2 0 2 4 6 8
とりあえず、簡単に書いてみた。
型を定義するのが手間だったので、sprout:array を継承してごまかしている。