2012-02-29 88 views
6

這是實現我自己的函數(例如DoSomethingWithRange)接受boost range作爲參數的好方法嗎?如何編寫一個boost :: Range作爲參數的函數?

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

回答

9

這不適用於正常的數組,因爲RangeType::const_iterator將不會被定義。在通過std::pair<iterator,iterator>傳遞時,它也不起作用,它也由Boost.Range支持。

相反,您應該使用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); 
} 
相關問題