2014-10-16 46 views
1

我想添加一個運算符[]來boost :: filtered_range類。 有我的代碼:boost :: filtered_range的引用類型的值

template <typename TPredicate, typename TRange> 
class my_filtered_range : public boost::filtered_range<TPredicate, TRange> 
{ 
public: 
    my_filtered_range(TPredicate Predicate, TRange &Range) : boost::filtered_range<TPredicate, TRange>(Predicate, Range) 
    { 
    } 

    size_t size() const 
    { 
     return std::distance(begin(), end()); 
    } 

    ???? &operator[](size_t Index) const 
    { 
     assert(Index < size()); 
     auto It = begin(); 
     std::advance(It, Index); 
     return *It; 
    } 
}; 

的問題是什麼類型的返回類型使用操作符[]? 規範'value_type'不允許在'const'容器中使用類,「decltype(* begin())」不能用我的VC++ 2013編譯。

+0

你是否在'尾隨返回類型中'decltype'嘗試'自動'? – Kiroxas 2014-10-16 15:01:15

回答

0

您應該能夠在基類上使用boost::range_reference<>特徵。

Live On Coliru

#include <boost/range/adaptors.hpp> 

template <typename TPredicate, typename TRange> 
class my_filtered_range : public boost::filtered_range<TPredicate, TRange> 
{ 
public: 
    typedef boost::filtered_range<TPredicate, TRange> base_type; 

    my_filtered_range(TPredicate Predicate, TRange &Range) : boost::filtered_range<TPredicate, TRange>(Predicate, Range) 
    { 
    } 

    size_t size() const 
    { 
     return std::distance(this->begin(), this->end()); 
    } 

    typename boost::range_reference<const base_type>::type operator[](size_t Index) const 
    { 
     assert(Index < this->size()); 
     auto It = this->begin(); 
     std::advance(It, Index); 
     return *It; 
    } 
}; 

注我如何檢測使用的是破碎的編譯器(MSVC),所以我添加了必要的資格依賴基部構件和類型。

+0

感謝您的解決方案。 「base_type」是私人的,我使用boost :: range_reference ,它工作。 – Raider 2014-10-16 21:10:01

+0

呃。 @Raider,'base_type'是**不是**私人的。我在我自己的樣本中定義它!你或許可以假設它對於基礎範圍來說是一樣的,但是爲什麼假設你能夠使它一般正確? – sehe 2014-10-16 21:29:58

+0

知道了!對不起,我不注意。 – Raider 2014-10-18 22:12:13