2012-02-29 12 views
6

Czy jest to dobry sposób na wdrożenie moich własnych funkcji (np. DoSomethingWithRange), które przyjmują jako parametr parametr boost range?Jak napisać funkcję, która ma parametr boost :: Range as?

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

Odpowiedz

9

Nie będzie działać z normalnymi tablicami, ponieważ RangeType::const_iterator nie zostanie zdefiniowany. Nie będzie także działać podczas przekazywania w std::pair<iterator,iterator>, który jest obsługiwany przez Boost.Range również.

Zamiast tego należy użyć boost::range_iterator<const RangeType>::type. Będzie to działać ze wszystkimi typami obsługiwanymi przez Boost.Range: normalne obiekty iteracyjne, tablice i pary iteratorów.

przykład:

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); 
} 
Powiązane problemy