如何编写一个以boost::Range为参数的函数

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

本文关键字:参数 函数 Range 一个以 boost 何编写      更新时间:2023-10-16

这是实现我自己的函数(例如DoSomethingWithRange)的好方法吗?这些函数接受升压范围作为参数?

#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));
}

这不适用于普通数组,因为不会定义RangeType::const_iterator。当传入Boost.Range也支持的std::pair<iterator,iterator>时,它也不起作用。

相反,您应该使用boost::range_iterator<const RangeType>::type。这将适用于Boost.Range支持的所有类型:普通可迭代对象、数组和迭代器对。

示例:

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);
}