How to write a function that has boost :: Range as a parameter?

Is this a good way to implement my own functions (e.g. DoSomethingWithRange ) that take an increase 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)); } 
+6
source share
1 answer

This will not work with regular arrays because RangeType::const_iterator will not be defined. It will also not work when passing to std::pair<iterator,iterator> , which is also supported by Boost.Range.

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 pairs of iterators.

Example:

 template <typename RangeType> void DoSomethingWithRange(const RangeType &range) { typedef typename boost::range_iterator<const RangeType>::type const_iterator; const_iterator endIt = boost::end(range); for(const_iterator it = boost::begin(range); it != endIt; ++it) cout << *it << endl; } int main(int, char** ) { vector<int> test; test.push_back(1); test.push_back(-1); DoSomethingWithRange(test); int test2[] = {12,34}; DoSomethingWithRange(test2); std::pair<int*,int*> test3(test2, test2+1); DoSomethingWithRange(test3); } 
+9
source

Source: https://habr.com/ru/post/909638/


All Articles