2015-11-05 30 views
0

我想用谓词boost::filter_iterator,看起来像这样:升压filter_iterator有没有缺省构造谓词

template<class tuple_t> 
    struct exactly { 

    tuple_t expected; 

    exactly(tuple_t&& expected) : expected(expected) {} 
    exactly(const tuple_t& expected) : expected(expected) {} 

    template<class actual_tuple_t, class I = make_index_sequence<tuple_size<tuple_t>::value>> 
    bool operator()(actual_tuple_t&& actual) const noexcept { 
     return compare_tuples_detail(equals(), expected, forward<actual_tuple_t>(actual), I()); 
    } 
    }; 

正如你可能已经猜到,我想这对我的容器中的元素比较存储的参考称为expected的元素。

显然,我不能将exactly作为类型参数传递给boost::make_filter_iterator,因为它不是默认的可构造的。而且我没有线索如何构建类传递给它像嘿,我实例为你,只需要调用它的operator()

这是我会用它的地方:

template<class predicate_t, class vector_t> 
    decltype(auto) filter_impl(vector_t&& v) noexcept { 

    auto good = boost::make_iterator_range(
     boost::make_filter_iterator<predicate_t>(begin(forward<vector_t>(v)), end(forward<vector_t>(v))), 
     boost::make_filter_iterator<predicate_t>(end(forward<vector_t>(v)), end(forward<vector_t>(v))) 
    ); 

    return remove_reference_t<vector_t>(good.begin(), good.end()); 
    }; 

回答

1

好吧,我已经找到了解决办法。 make_filter_iterator不能做到这一点,但filter_iterator有一个构造函数取一个判断

template <class Predicate, class Iterator> 
class filter_iterator 
{ 
public: 
    typedef iterator_traits<Iterator>::value_type value_type; 
    typedef iterator_traits<Iterator>::reference reference; 
    typedef iterator_traits<Iterator>::pointer pointer; 
    typedef iterator_traits<Iterator>::difference_type difference_type; 
    typedef /* see below */ iterator_category; 

    filter_iterator(); 
    filter_iterator(Predicate f, Iterator x, Iterator end = Iterator()); 
    filter_iterator(Iterator x, Iterator end = Iterator()); 
    template<class OtherIterator> 
    filter_iterator(
     filter_iterator<Predicate, OtherIterator> const& t 
     , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition 
     ); 
    Predicate predicate() const; 
    Iterator end() const; 
    Iterator const& base() const; 
    reference operator*() const; 
    filter_iterator& operator++(); 
private: 
    Predicate m_pred; // exposition only 
    Iterator m_iter; // exposition only 
    Iterator m_end; // exposition only 
}; 

来自Boost文档。

所以我需要调用它像这样:

template<class predicate_t, class vector_t> 
    decltype(auto) filter_impl(predicate_t&& p, vector_t&& v) noexcept { 

    auto good = boost::make_iterator_range(
     boost::filter_iterator<predicate_t, decltype(begin(forward<vector_t>(v)))> 
     (forward<predicate_t>(p), begin(forward<vector_t>(v)), end(forward<vector_t>(v))), 
     boost::filter_iterator<predicate_t, decltype(begin(forward<vector_t>(v)))> 
     (forward<predicate_t>(p), end(forward<vector_t>(v)), end(forward<vector_t>(v))) 
    ); 

    return remove_reference_t<vector_t>(good.begin(), good.end()); 
    };