C++14 で 1_upto(10) みたいな風に書く
『n 回のループを簡単に書きたい〜』ってことでユーザ定義リテラルを使って upto
を書いてみた。
[コード]
template<typename T> struct numeric_range{ struct iterator{ auto operator ++(){ return ++value; } auto operator *() const{ return value; } bool operator !=(iterator const& it) const{ return value != it.value; } T value; }; auto& begin(){ return first; } auto& end(){ return last; } auto operator -(){ return numeric_range<T>{ {-first.value}, last }; } iterator first; iterator last; }; auto operator"" _upto(unsigned long long first){ return [=](long long last){ return numeric_range<long long>{ {static_cast<long long>(first)}, {++last} }; }; } #include <iostream> int main(){ for(auto&& i : 1_upto(10)){ std::cout << i << ", "; } std::cout << "\n"; for(auto&& i : -10_upto(0)){ std::cout << i << ", "; } return 0; } /* output: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, */
ユーザ定義リテラルを利用して 1_upto(10)
みたいに書くことが出来ます。
リテラルに対してしかかけないけど、割と便利じゃないかな。