boost :: filtered_range值的引用类型

时间:2014-10-16 14:54:05

标签: c++ boost

我想在boost :: filtered_range类中添加一个operator []。 有我的代码:

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

问题是什么类型作为operator []的返回类型? 规范'value_type'不允许使用带'const'容器的类,“decltype(* begin())”不能用我的VC ++ 2013编译。

1 个答案:

答案 0 :(得分:1)

您应该能够在基类上使用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),因此我向依赖的基本成员和类型添加了必要的资格。