Boost logo

Boost :

Subject: Re: [boost] [range]slicing any_range
From: Takatoshi Kondo (redboltz_at_[hidden])
Date: 2013-12-24 21:25:41


On Tue, Dec 24, 2013 at 8:48 PM, Takatoshi Kondo <redboltz_at_[hidden]> wrote:
>> typedef boost::any_range<int, boost::random_access_traversal_tag, int,
>> std::ptrdiff_t> int_range;

I realized the problem in my code. int_range doesn't support a
reference. It should be
typedef boost::any_range<int, boost::random_access_traversal_tag, int&,
 std::ptrdiff_t> int_range;

If the boost::iterator_facade is passed the template arguments
boost::random_access_traversal_tag as Traversal and no reference type
as Reference, the iterator_category is input_iterator due to a lack of
reference support.

I checked facade_iterator_category.hpp and wrote the following test
code to clarify my understanding.

#include <boost/iterator/iterator_facade.hpp>

struct my_iter:boost::iterator_facade<my_iter, int,
boost::random_access_traversal_tag, int&> {};
struct my_iter_noref:boost::iterator_facade<my_iter, int,
boost::random_access_traversal_tag, int> {};
int main() {
  // has reference
  static_assert(
    std::is_convertible<
      std::iterator_traits<my_iter>::iterator_category,
      std::random_access_iterator_tag
>::value, "");
  // no reference
  static_assert(
    !std::is_convertible<
      std::iterator_traits<my_iter_noref>::iterator_category,
      std::random_access_iterator_tag
>::value, "");
  static_assert(
    std::is_convertible<
      std::iterator_traits<my_iter_noref>::iterator_category,
      std::input_iterator_tag
>::value, "");
}

Takatoshi Kondo


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk