読者です 読者をやめる 読者になる 読者になる

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) みたいに書くことが出来ます。
リテラルに対してしかかけないけど、割と便利じゃないかな。