BOOST_PP で、範囲の初期化

ふと、思いついたので書いてみた。
mpl::range_c や、boost::irange とかそんな感じ。
こういうのは、プリプロセッサが楽ですね。
まぁ特にプリプロセッサで書く意味もない気がしますが。

[ソース]

#include <boost/preprocessor/repeat_from_to.hpp>

#define INITIALIZER_RANGE_DECL(z, n, text) n,
#define INITIALIZER_RANGE_(first, last) { \
        BOOST_PP_REPEAT_FROM_TO(first, last, INITIALIZER_RANGE_DECL, ~) \
    }
#define initializer_range INITIALIZER_RANGE_

#include <boost/range/algorithm/for_each.hpp>
#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <vector>
#include <initializer_list>

int
main(){
    int array[] = initializer_range(0, 10);
    boost::for_each(array, std::cout << boost::lambda::_1 << ",");
    
    // C++0x の initializer_list に対応していれば
    std::vector<int> v = initializer_range(10, 20);
    for(auto n : v){
        std::cout << n << ",";
    }
    return 0;
}

[出力]

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,

[boost]

  • ver 1.47.0 beta1