2012-02-29 11 views
6

これは、パラメータとしてboost rangeを受け入れる独自の機能(例:DoSomethingWithRange)を実装する良い方法ですか?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が定義されないので、これは、通常の配列と機能しません。また、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); 
} 
関連する問題