What\'s the best way for setting an std::vector
to a range, e.g. all numbers between 3 and 16?
std::iota - is useful, but it requires iterator, before creation vector, .... so I take own solution.
#include
#include
template struct seq{ typedef seq type;};
template< typename I, typename J> struct add;
template< int...I, int ...J>
struct add< seq, seq > : seq{};
template< int N>
struct make_seq : add< typename make_seq::type,
typename make_seq::type > {};
template<> struct make_seq<0>{ typedef seq<> type; };
template<> struct make_seq<1>{ typedef seq<0> type; };
template
std::initializer_list range_impl(seq )
{
return { (start + I*step) ...};
}
template
std::initializer_list range()
{
return range_impl(typename make_seq< 1+ (finish - start )/step >::type {} );
}
int main()
{
std::vector vrange { range<3, 16>( )} ;
for(auto x : vrange)std::cout << x << ' ';
}
Output:
3 4 5 6 7 8 9 10 11 12 13 14 15 16