2012-02-29 1 views
6

È un buon modo per implementare le mie funzioni (ad esempio DoSomethingWithRange) che accettano un parametro come boost range?Come scrivere una funzione che ha un boost :: Range come parametro?

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

risposta

9

Questo non funziona con i normali array, perché non sarà definito. Inoltre non funzionerà quando si passa in std::pair<iterator,iterator>, che è supportato anche da Boost.Range.

Invece, è necessario utilizzare boost::range_iterator<const RangeType>::type. Funzionerà con tutti i tipi supportati da Boost.Range: normali oggetti iterabili, matrici e coppie iteratore.

Esempio:

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