我想在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编译。
答案 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),因此我向依赖的基本成员和类型添加了必要的资格。