Is this a good way to implement my own functions (e.g. DoSomethingWithRange) that accept a boost range as a parameter?
#include <iostream>
#include <vector>
#include <boost/range.hpp>
#include <boost/range/algorithm.hpp>
#include <boost/range/adaptors.hpp>
using namespace std;
template <typename RangeType>
void DoSomethingWithRange(const RangeType &range)
{
typename RangeType::const_iterator beginIt = boost::begin(range);
typename RangeType::const_iterator endIt = boost::end(range);
for(typename RangeType::const_iterator it = beginIt; it != endIt; ++it)
{
cout << *it << endl;
}
}
bool IsPos(int i)
{
return i>0;
}
int main(int , char** )
{
vector<int> test;
test.push_back(1);
test.push_back(-1);
DoSomethingWithRange(test | boost::adaptors::filtered(IsPos));
}
This won’t work with normal arrays, because
RangeType::const_iteratorwon’t be defined. It also won’t work when passing instd::pair<iterator,iterator>, which is supported by Boost.Range as well.Instead, you should use
boost::range_iterator<const RangeType>::type. This will work with all types supported by Boost.Range: normal iterable objects, arrays, and iterator pairs.Example: